索引对多个where子句SQL的影响

时间:2016-04-04 13:33:07

标签: sql-server indexing

我有一个包含3-400k条目的表。

我想对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);

1 个答案:

答案 0 :(得分: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;