2017-02-16 29 views
0

使用Postgresql 9.5,希望知道索引表的最佳方式,以便以下查詢不會使用順序掃描。索引幫助(Postgresql不等於文本)

SELECT * 
FROM MYTABLE 
WHERE (
COL1 NOT IN ('980','982','983','984','985','986','987','988','989','990','991','996','997') 
OR 
COL2 <> '999' 
) 
+0

爲什麼你認爲seq掃描不好?請[編輯]你的問題,並添加使用**'explain(analyze,verbose)'**生成的執行計劃。 [_Formatted_](http://dba.stackexchange.com/help/formatting)**文本**請[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i -not-upload-images-of-code-on-so-when-asking-question-285557#285557) –

+0

從來沒有說過我認爲他們是不好的 – Pyrite

+0

那麼你爲什麼要避免它? –

回答

1

只要定義完全相同的部分索引,其中,在你的SELECT語句中使用子句:

CREATE INDEX ON mytable ((col1 IS NULL)) WHERE (
    COL1 NOT IN ('980','982','983','984','985','986','987','988','989','990','991','996','997') 
    OR 
    COL2 <> '999' 
) 

表達col1 IS NULL只是填充在其中產生存儲一個布爾值在索引中,因爲它是緊湊的(每行只有一個字節),並且不清楚列中哪些列是有意義的。如果您持續查詢所有列,並且您不關心通過虛擬複製所有數據佔用磁盤空間,那麼在索引中包括所有列可能會使性能更有意義。

編輯:順序掃描本身並不壞。通常,當PostgreSQL傾向於使用現有索引進行順序掃描時,這有一個很好的理由。否則,可以調整配置以更準確地反映其服務器環境。