Postgresql

PostgreSQL 可以在其索引中使用空值嗎?

  • August 12, 2015

我一直在讀這本書,它說

數據庫假設 Indexed_Col IS NOT NULL 覆蓋的範圍太大而無用,因此數據庫不會從這種情況驅動到索引。

我知道這本書已有 10 多年的歷史,但它已經證明非常有用——使用從其頁面收集的說明,我將查詢速度提高了十倍。

此外,在執行EXPLAIN ANALYZE查詢SELECT時,我發現我的任何索引都沒有被使用,即使按照所有權利,它們應該被使用。

因此,我的問題是:

假設有一個表有一個列,其列定義包括“NOT NULL”,並且存在一個覆蓋該列的索引,該索引是否會用於該表的查詢,其中列是查詢的一部分?

喜歡:

CREATE TABLE my_table(
a varchar NOT NULL
);

CREATE INDEX ix_my_table ON my_table(a);

SELECT a from my_table;

PostgreSQL 當然可以IS NOT NULL. 我也沒有看到任何關於該條件的查詢規劃器假設。

如果列 ( pg_statistic.stanullfrac) 的空分數足夠低,表明索引對查詢很有用,則 PostgreSQL 將使用索引。

我無法弄清楚你想說什麼:

如果這是正確的,我是否理解在使用該列的查詢中不使用定義為“NOT NULL”的列上的索引?

當然,索引不會用於列IS NOT NULL上的條件NOT NULL。它總是匹配 100% 的行,所以 seqscan 幾乎總是會快得多。

如果索引沒有為查詢過濾掉大部分行,則 PostgreSQL 不會使用索引。唯一可能的例外是當您請求單個索引覆蓋的一組列時,其順序與索引的順序匹配。然後 PostgreSQL 可能會進行僅索引掃描。例如,如果有一個索引t(a, b, c)並且你:

select a, b FROM t ORDER BY a, b, c;

PostgreSQL 可能會使用您的索引,即使沒有過濾掉任何行,因為它只需要讀取索引並且可以跳過讀取堆,避免進行排序等。

引用自:https://dba.stackexchange.com/questions/110607