2016-04-04 40 views
0

我有一个包含3-400k条目的表。索引对多个where子句的影响SQL

我想要做ABCDEFABCDEFAB. (= A, = AB..) 前缀检查我已经索引创建 table.IDX:在列的非唯一性哈希索引:

TYPE 
INFORMATION 
MATCH_PATTERN 
MATCH_TYPE 

我注意到SQL请求低于不使用索引已创建。 是这样吗?有关这方面的任何文件?

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'。 “信息”的名称也不同于查询中的名称。 – 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