[pgpool-general-jp: 962] Re: SELECT クエリのレプリケートについて

GOTO, Daisuke gotoh @ m-design.com
2011年 8月 1日 (月) 20:25:41 JST


後藤@MDCと申します。

ご回答ありがとうございます。


> > 結果、他のINSERTとタイミングがかぶると
> > kind mismatch among backends
> > が発生してしまう場合が稀にあります。

考慮から抜けていたのですが、
クエリがレプリケートされていないのに
 kind mismatch among backends
となることは無い、と考えてよろしいのでしょうか。

> > replicate_select は falseなのに
> > selectのクエリがレプリケートされてしまうのは何故でしょうか。
> > selectのクエリでもレプリケートされてしまうような条件があるのでしょうか?
> 
> マニュアルの「ロードバランスの条件について」にあるフローチャートによると、
> 以下の場合は、SELECTでもレプリケートする仕様になっています。
> 
> - SELECT INTO
> - SELECT FOR UPDATE/SHARE
> - nextval()かsetval()を含む
> 
> これらには該当しますでしょうか?
> 

いいえ。
いずれにも該当しません。

> もし該当しなければバグの可能性もありますので、再現調査のため、実際の
> SELECT文(データ部分は適当な文字列に置き換えても構いません)とそれに
> 関連するテーブル定義をお知らせ頂けると幸いです。
> 

文末にサンプルを載せました。
抜粋&置換をしたので実際とは異なるのですが。
解決の一助となれば幸いです。

> > また、/*insert lock*/のようにコメント等を指定することで、
> > 明示的にクエリをレプリケートさせないようにする方法などはあるのでしょうか?
> 
> ありません、逆(レプリケートさせる)はできるのですが…。
> 

そうですか。了解しました。
小手先では解決しなさそうですね。

以下、サンプルの定義とデータ、クエリになります。

--
--■テーブル1

create sequence dcmnt_exec_seq;

create table dcmnt_exec (
 exec_id          bigint                       not null default nextval('dcmnt_exec_seq')
, exec_from        integer                     
, p_data           text                        
, pdf_binarydata   character varying(255)      
, tiff_binarydata  character varying(255)      
, exec_status      smallint                    
, error_code       character varying(255)      
, exec_date        timestamp without time zone  default now()
, fix_date         timestamp without time zone  default now()
, trkbi            timestamp without time zone  default now()
, endbi            timestamp without time zone  default now()
, flag1            smallint                    
, flag2            smallint                    
, flag3            smallint                    
, del_flag         smallint                    
, dcmntdir_id      bigint                      
, login_masterid   bigint                      
, p_udc            text                        
, dcmnt_date       timestamp without time zone 
);

create index dcmnt_exec_idx1 on dcmnt_exec(exec_id);
create index dcmnt_exec_idx2 on dcmnt_exec(exec_from);

insert into dcmnt_exec (exec_id,exec_from,p_data,exec_status,error_code,exec_date,fix_date,trkbi,endbi,dcmntdir_id,login_masterid,dcmnt_date) values
 (330960,1,'aaa',5 ,'ERR000000','2009-12-24 09:13:36','2009-12-24 09:16:38','2009-12-24 09:16:38','2009-12-24 09:16:38',1 ,161 ,'2009-12-24 09:16:38')
,(620589,1,'bbb',5 ,'ERR000000','2010-03-15 15:55:07','2010-03-15 16:11:28','2010-03-15 16:11:28','2010-03-15 16:11:28',1 ,144 ,'2010-03-15 16:11:28')
;

--
--■テーブル2

create sequence dcmnt_exec_ms_seq;

create table dcmnt_exec_ms (
 exec_ms_id    bigint                      not null default nextval('dcmnt_exec_ms_seq'::regclass)
,exec_id       bigint                      
,inquirycode   character varying(255)      
,userid        character varying(255)      
,code_a        character varying(18)       
,code_b        text                        
,flag_a        character varying(255)      
,flag_b        character varying(255)      
,dcmnt_code    character varying(255)      
,code_p        character varying(255)      
,code_a_1      character varying(16)       
,code_a_2      character varying(16)       
,code_a_3      character varying(16)       
,code_a_4      character varying(16)       
,code_a_5      character varying(16)       
,name_p        character varying(50)       
,tname1        character varying(255)      
,tname2        character varying(255)      
,tname3        character varying(255)      
,tname4        character varying(255)      
,tname5        character varying(255)      
,data_recycle  character varying(255)      
,trkbi         timestamp without time zone default now()
,endbi         timestamp without time zone default now()
,flag1         smallint                    
,flag2         smallint                    
,flag3         smallint                    
,del_flag      smallint                    
,flag_c        character varying(255)      
,flag_d        character varying(255)      
);

create index dcmnt_exec_ms_idx1 on dcmnt_exec_ms(exec_id);
create index dcmnt_exec_ms_idx2 on dcmnt_exec_ms(exec_ms_id, exec_id);
create index dcmnt_exec_ms_idx3 on dcmnt_exec_ms(inquirycode);
create index dcmnt_exec_ms_idx4 on dcmnt_exec_ms(code_p, code_a_1, code_a_2, code_a_3, code_a_4, code_a_5);

insert into dcmnt_exec_ms (exec_ms_id, exec_id, userid, code_a, code_b, flag_a, flag_b, dcmnt_code, code_p, code_a_1, code_a_2, code_a_3, data_recycle, trkbi, endbi, flag_c, flag_d) values
 (330576,330960 ,'AAAA1111','123456780120000000','123-4'   , '1','2','1234','12','345','678','012','2','2009-12-24 09:13:36','2010-04-16 08:33:19','1','0')
,(620205,620589 ,'BBBB2222','123456780120000000','5-6-7', '1','1','1234','12','345','678','012','2','2010-03-15 15:55:07','2010-04-16 08:33:19','1','0')
;

--
--■問題のクエリ

SELECT
 DEM.code_a,
 DEM.code_b,
 ( case when sum(case when DEM.flag_a = '1' then 1 else 0 end) > 0 then 1 else 0 end + 
   case when sum(case when DEM.flag_a = '2' then 1 else 0 end) > 0 then 2 else 0 end +
   case when sum(case when DEM.flag_a = '3' then 1 else 0 end) > 0 then 4 else 0 end
 ) flag_a,
DEM.flag_b,
NULL AS flag_c,
NULL AS flag_d
FROM dcmnt_exec AS DE LEFT JOIN (
SELECT exec_id, code_a, code_b, flag_a, flag_b, flag_c, flag_d
FROM dcmnt_exec_ms
WHERE code_a = '123456780120000000' AND data_recycle = '2' AND del_flag IS NULL
) DEM ON DE.exec_id = DEM.exec_id
WHERE DEM.code_a = '123456780120000000' AND DE.exec_status = '5' AND del_flag IS NULL
GROUP BY DEM.code_a, DEM.code_b, DEM.flag_b
ORDER BY
to_number(COALESCE(NULLIF(substring(translate(DEM.code_b, '0123456789', '0123456789') from '[0-9]*'), ''), '0'), '99999999999999999999'),
to_number(COALESCE(NULLIF(substr(substring(translate(DEM.code_b, '0123456789', '0123456789') from '[0-9]+[^0-9]+[0-9]*'), length(substring(translate(DEM.code_b, '0123456789', '0123456789') from '[0-9]+[^0-9]+'))+1), ''), '0'), '99999999999999999999'),
to_number(COALESCE(NULLIF(substr(substring(translate(DEM.code_b, '0123456789', '0123456789') from '[0-9]+[^0-9]+[0-9]+[^0-9]+[0-9]*'), length(substring(translate(DEM.code_b, '0123456789', '0123456789') from '[0-9]+[^0-9]+[0-9]+[^0-9]+'))+1), ''), '0'), '99999999999999999999'),
DEM.flag_b
;


-- 
 後藤 大輔<gotoh @ m-design.com>
 株式会社エム・ディー・シー
 〒212-0012 川崎市幸区中幸町3丁目2
 Tel. 044-555-3185 Fax. 044-555-5700


pgpool-general-jp メーリングリストの案内