2011-07-18 7 views
1

なぜフルスキャンが必要なのですか?HSQL 2.2.4、不正なクエリプラン

table=INTR 
alias=IR1 
access=FULL SCAN 

IR2は、フルスキャン必要はありませんでした:それはまったく同じである

table=INTR 
alias=IR2 
access=INDEX PRED 

に参加する:ここで

EXPLAIN PLAN FOR SELECT * 
FROM DTMS.INTR_SUB s 
JOIN DTMS.INTR ir1 ON s.CLASS_1 = ir1.CLASS 
JOIN DTMS.NDC_INDEX n1 ON ir1.KDC1 = n1.KDC1 
JOIN DTMS.INTR ir2 ON s.CLASS_2 = ir2.CLASS 
JOIN DTMS.NDC_INDEX n2 ON ir2.KDC1 = n2.KDC1 
WHERE n1.NDC = 378204701 AND n2.NDC = 378204701 

が私のインデックスです:

s INDEX 1 CLASS_1 
s INDEX 2 CLASS_2 
ir PRIMARY KEY(KDC1,CLASS) 
ir INDEX (CLASS) 

もしI s.CLASS_1のインデックスを無効にする(0を追加する)、 HSQLは、IR1 とIR2に対して同じインデックスを使用できると判断します。

alias=S 
access=FULL SCAN 

table=INTR 
alias=IR2 
access=INDEX PRED 

table=INTR 
alias=IR1 
access=INDEX PRED 

EXPLAIN PLAN FOR SELECT * 
FROM DTMS.INTR_SUB s 
JOIN DTMS.INTR ir1 ON s.CLASS_1+0 = ir1.CLASS 
JOIN DTMS.NDC_INDEX n1 ON ir1.KDC1 = n1.KDC1 
JOIN DTMS.INTR ir2 ON s.CLASS_2 = ir2.CLASS 
JOIN DTMS.NDC_INDEX n2 ON ir2.KDC1 = n2.KDC1 
WHERE n1.NDC = 378204701 AND n2.NDC = 378204701 

これはスキーマです。

CREATE SCHEMA DTMS AUTHORIZATION SA; 

SET SCHEMA DTMS; 

CREATE CACHED TABLE DTMS.INTR(KDC1 NUMERIC(5) NOT NULL,CLASS NUMERIC(5) NOT NULL,PRIMARY KEY(KDC1,CLASS)); 

CREATE CACHED TABLE DTMS.NDC_INDEX(NDC NUMERIC(11) PRIMARY KEY,KDC1 NUMERIC(5) NOT NULL,KDC2 NUMERIC(2) NOT NULL,KDC3 NUMERIC(3) NOT NULL,ACTIVITY_CODE NUMERIC(1) NOT NULL,ROUTE_ABRV CHARACTER(2) NOT NULL); 

CREATE CACHED TABLE DTMS.INTR_SUB(CLASS_1 NUMERIC(5) NOT NULL,DURATION_1 NUMERIC(3) NOT NULL,SCHEDULE_1 NUMERIC(3) NOT NULL,ACTIVITY_CODE_1 NUMERIC(1) NOT NULL,CLASS_2 NUMERIC(5) NOT NULL,DURATION_2 NUMERIC(3) NOT NULL,SCHEDULE_2 NUMERIC(3) NOT NULL,ACTIVITY_CODE_2 NUMERIC(1) NOT NULL,ONSET_CODE NUMERIC(1) NOT NULL,SEVERITY_CODE NUMERIC(1) NOT NULL,DOC_CODE NUMERIC(1) NOT NULL,MGMT_CODE NUMERIC(1) NOT NULL,FILE_POS NUMERIC(15) NOT NULL); 

CREATE INDEX INTR_SUB_CLASS_1 ON DTMS.INTR_SUB(CLASS_1); 
CREATE INDEX INTR_SUB_CLASS_2 ON DTMS.INTR_SUB(CLASS_2); 
CREATE INDEX INTR_CLASS ON DTMS.INTR(CLASS); 

答えて

3

この問題は、次のように報告2.2.5で修正されています:データベースマネージャでは、私は三つのテーブルを作るために、別々のテーブルを作成/ペースト をコピーする必要がありました。

][range variable 2         
    join type=INNER          
    table=INTR           
    alias=IR1           
    access=INDEX PRED         

    ][range variable 4         
    join type=INNER          
    table=INTR           
    alias=IR2           
    access=INDEX PRED   

DatabaseManagerの使用に関しては、スキーマ全体をテーブルとインデックスとともに単一のSQL文として定義することができます。セミコロンは最後にのみ使用されます。このステートメントは、SQLの単一のCREATE SCHEMAステートメントであるため、DatabaseManagerによって完全に実行されます。

CREATE SCHEMA DTMS AUTHORIZATION SA 
CREATE CACHED TABLE DTMS.INTR(KDC1 NUMERIC(5) NOT NULL,CLASS NUMERIC(5) NOT NULL,PRIMARY KEY(KDC1,CLASS)) 
CREATE CACHED TABLE DTMS.NDC_INDEX(NDC NUMERIC(11) PRIMARY KEY,KDC1 NUMERIC(5) NOT NULL,KDC2 NUMERIC(2) NOT NULL,KDC3 NUMERIC(3) NOT NULL,ACTIVITY_CODE NUMERIC(1) NOT NULL,ROUTE_ABRV CHARACTER(2) NOT NULL) 
CREATE CACHED TABLE DTMS.INTR_SUB(CLASS_1 NUMERIC(5) NOT NULL,DURATION_1 NUMERIC(3) NOT NULL,SCHEDULE_1 NUMERIC(3) NOT NULL,ACTIVITY_CODE_1 NUMERIC(1) NOT NULL,CLASS_2 NUMERIC(5) NOT NULL,DURATION_2 NUMERIC(3) NOT NULL,SCHEDULE_2 NUMERIC(3) NOT NULL,ACTIVITY_CODE_2 NUMERIC(1) NOT NULL,ONSET_CODE NUMERIC(1) NOT NULL,SEVERITY_CODE NUMERIC(1) NOT NULL,DOC_CODE NUMERIC(1) NOT NULL,MGMT_CODE NUMERIC(1) NOT NULL,FILE_POS NUMERIC(15) NOT NULL) 
CREATE INDEX INTR_SUB_CLASS_1 ON DTMS.INTR_SUB(CLASS_1) 
CREATE INDEX INTR_SUB_CLASS_2 ON DTMS.INTR_SUB(CLASS_2) 
CREATE INDEX INTR_CLASS ON DTMS.INTR(CLASS); 
関連する問題