我有一个包含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);
答案 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;