2016-04-04 16 views
0

3-400k girişleri içeren bir tablom var. sütunlarda benzersiz olmayan karma endeksi::Birden çok yerde dizin üzerinde dizin etkisi SQL

TYPE 
INFORMATION 
MATCH_PATTERN 
MATCH_TYPE 

ben sql isteği aşağıda kullanmaz fark

ben endeksi table.IDX oluşturduk ABCDEFABCDEFAB. (= A, = AB..) bir önek kontrolü yapmak istiyor dizin oluşturuldu. Bu böyle mi? Bununla ilgili herhangi bir belge var mı?

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

İşaret sütunları geçmeyi deneyin, sırası önemlidir. TİP, bilgi, MATCH_TYPE, MATCH_PATTERN'. Ayrıca 'bilgi 'sorgusundan farklı bir adı vardır. – Igor

+2

Sadece kısa bir soru: Yukarıdaki ölçütlere uymayan kayıtlardan kaç tanesi? Çünkü eğer çok fazla değil ya da tüm sıraların% 50-60'ından fazla değilse, o zaman sorgu optimiser bir tablo taraması seçecektir. – Gabor

+0

Lütfen "DDL + yürütme planı" nı – Devart

cevap

0

Bu endeks kullanımı yapacak, çirkin ama iyi performans olmalıdır:

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

Bunu deneyeceğim! – user2120095

İlgili konular