2016-04-04 11 views
0

私は3〜400kのエントリを含むテーブルを持っています。私は、以下のSQL要求を使用していないことに気づいた複数のwhere句に対するインデックスの影響SQL

TYPE 
INFORMATION 
MATCH_PATTERN 
MATCH_TYPE 

:列の非一意のハッシュインデックス:私はインデックスが table.IDXを作成している私はABCDEFABCDEFAB. (= A, = AB..) の接頭チェックをしたい

インデックスが作成されました。 それは事実ですか?これに関するドキュメンテーション?

SELECT COUNT(*) 
       FROM table 
       WHERE  table.type = 'TYPE' 
       AND  table.info = 'INFO' 
       AND  table.match_type = 'Prefix' 
     AND  (table.match_pattern like 'ABCDEFABCDEFAB%' OR 
       table.match_pattern = 'ABCDEFABCDEFAB' OR 
       table.match_pattern = 'ABCDEFABCDEFA' OR 
       table.match_pattern = 'ABCDEFABCDEF' OR 
       table.match_pattern = 'ABCDEFABCDE' OR 
       table.match_pattern = 'ABCDEFABCD' OR 
       table.match_pattern = 'ABCDEFABC' OR 
       table.match_pattern = 'ABCDEFAB' OR 
       table.match_pattern = 'ABCDEFA' OR 
       table.match_pattern = 'ABCDEF' OR 
       table.match_pattern = 'ABCDE' OR 
       table.match_pattern = 'ABCD' OR 
       table.match_pattern = 'ABC' OR 
       table.match_pattern = 'AB' OR 
       table.match_pattern = 'A'); 



create table aTable (
    SERIAL    INTEGER, 
    NAME  CHAR(30), 
    TYPE  CHAR(32), 
    INFORMATION CHAR(32), 
    MATCH_PATTERN  CHAR(40), 
    MATCH_TYPE   TINYINT, 
    primary key (SERIAL), 
    foreign key (NAME) references nameTable(name)); 
create unique index NS.IDX 
ON aTable(NAME, TYPE, INFORMATION, MATCH_PATTERN, MATCH_TYPE); 
+0

は、あなたのインデックス列を切り替えてみてください、順序が重要です。 'TYPE、info、MATCH_TYPE、MATCH_PATTERN'です。また、 'information'はクエリとは異なる名前です。 – Igor

+2

ちょっと疑問があります:上記の基準に合致しないレコードの数はいくつですか?これは、すべてのローの50-60%を超えていないか、それほど多くない場合は、クエリオプティマイザがテーブルスキャンを選択するためです。 – Gabor

+0

'DDL +実行計画'を提供してください – Devart

答えて

0

これは、インデックスを利用します、それは醜いですが、うまく実行する必要があります。

SELECT SUM(CNT) FROM (
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern like 'ABCDEFABCDEFAB%' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'ABCDEFABCDEFAB' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'ABCDEFABCDEFA' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'ABCDEFABCDEF' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'ABCDEFABCDE' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'ABCDEFABCD' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'ABCDEFABC' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'ABCDEFAB' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'ABCDEFA' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'ABCDEF' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'ABCDE' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'ABCD' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'ABC' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'AB' 
    UNION ALL 
    SELECT COUNT(*) AS CNT FROM table 
    WHERE type = 'TYPE' AND info = 'INFO' AND match_type = 'Prefix' AND 
     match_pattern = 'A' 
) x; 
+0

ありがとう、私はそれを試みます! – user2120095

関連する問題