Craig'in kapsamlı cevabına ek olarak, referans verdiğiniz kitabın kapağının şunları söylediğini eklemek istedim:
Oracle, DB2 ve SQL Server'ı kapsar
Bu yüzden özellikle PostgreSQL konusunda harika bir tavsiye kaynağı olduğuna inanmam. Her RDBMS şaşırtıcı derecede farklı olabilir!
Orijinal sorunuzla ilgili biraz kafam karıştı, ancak kitabın bölümünün% 100 doğru olmadığını gösteren bir örnek. Daha fazla karışıklığı önlemek için, ilgili paragrafın tamamı, Google Kitap Arama'da görebilirsiniz .
Veritabanı, Indexed_Col IS NOT NULL değerinin yararlı olmak için çok büyük bir aralığı kapsadığını varsayar, bu nedenle veritabanı bu koşuldan bir dizine gitmez. Nadir durumlarda, null olmayan herhangi bir değere sahip olmak o kadar nadirdir ki, olası tüm null olmayan değerler üzerinde bir indeks aralığı taraması yararlıdır. Bu gibi durumlarda, olası tüm değerlerin aralığı için güvenli bir alt veya üst sınır belirleyebiliyorsanız, Positive_ID_Column> -1 veya Date_Column> TO_DATE ('0001/01/01' gibi bir koşulu olan bir aralık taramasını etkinleştirebilirsiniz. , 'YYYY / AA / GG').
Postgres aslında (aşağıda belirtilen durumda) IS NOT NULL
önerilen aralık aralığı taramalarını eklemeden sorguları tatmin etmek için bir indeks kullanabilir Positive_ID_Column > -1
. Craig'in Postgres'in bu özel durumda neden bu dizini seçtiğine ilişkin sorularına ve kısmi dizin kullanma hakkındaki notlara bakın.
CREATE TABLE bar (a int);
INSERT INTO bar (a) SELECT NULL FROM generate_series(1,1000000);
INSERT INTO bar (a) VALUES (1);
CREATE INDEX bar_idx ON bar (a);
EXPLAIN ANALYZE SELECT * FROM bar WHERE a IS NOT NULL;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Index Only Scan using bar_idx on bar (cost=0.42..8.44 rows=1 width=4) (actual time=0.094..0.095 rows=1 loops=1)
Index Cond: (a IS NOT NULL)
Heap Fetches: 1
Total runtime: 0.126 ms
(4 rows)
Bu arada Postgres 9.3, ancak sonuçların 9.1'de kabaca benzer olacağına inanıyorum, ancak "Sadece Dizin Taraması" kullanmasa da.
Düzenleme: Orijinal sorunuzu netleştirdiğinizi görüyorum ve görünüşe göre Postgres'in neden basit bir örnekte bir dizin kullanmadığını merak ediyorsunuz:
CREATE TABLE my_table(
a varchar NOT NULL
);
CREATE INDEX ix_my_table ON my_table(a);
SELECT a from my_table;
Muhtemelen tabloda hiç satırınız olmadığı için. Bu yüzden bazı test verileri ve ekleyin ANALYZE my_table;
.