Mengapa operator agregat digunakan setelah pemindaian indeks yang unik

15

Saya memiliki tabel dengan indeks unik yang difilter untuk nilai yang tidak dapat dibatalkan. Dalam rencana kueri ada penggunaan yang berbeda. Apakah ada alasan untuk ini?

USE tempdb

CREATE TABLE T1( Id INT NOT NULL  IDENTITY PRIMARY KEY ,F1 INT , F2 INT )
go
CREATE UNIQUE NONCLUSTERED INDEX UK_T1 ON T1 (F1,F2) WHERE F1 IS NOT NULL AND F2 IS NOT NULL 
GO
INSERT INTO  T1(f1,F2) VALUES(1,1),(1,2),(2,1)

SELECT DISTINCT   F1,F2 FROM T1 WHERE F1 IS NOT NULL AND F2 IS NOT NULL 
SELECT  F1,F2 FROM T1 WHERE F1 IS NOT NULL AND F2 IS NOT NULL  

rencana permintaan: masukkan deskripsi gambar di sini

mordechai
sumber

Jawaban:

15

Ini adalah batasan pengoptimal permintaan SQL Server yang dikenal. Sudah dilaporkan ke Microsoft, tetapi item Sambungkan (tidak lagi tersedia) ditutup Tidak akan Perbaiki.

Ada konsekuensi tambahan dari batasan ini, termasuk beberapa yang saya tulis di Batasan Pengoptimal dengan Indeks yang Difilter , rangkumannya dikutip di bawah ini:

Posting ini menyoroti dua batasan pengoptimal penting dengan indeks yang difilter:

  • Predikat gabungan yang berlebihan mungkin diperlukan untuk mencocokkan indeks yang difilter
  • Indeks unik yang difilter tidak memberikan informasi keunikan kepada pengoptimal

Dalam beberapa kasus mungkin praktis untuk menambahkan predikat berlebihan untuk setiap permintaan. Alternatifnya adalah merangkum predikat tersirat yang diinginkan dalam tampilan yang tidak terindeks. Paket hash cocok dalam posting ini jauh lebih baik daripada rencana default, meskipun pengoptimal harus dapat menemukan rencana bergabung gabungan yang sedikit lebih baik. Terkadang, Anda mungkin perlu mengindeks tampilan dan menggunakan NOEXPANDpetunjuk (tetap diperlukan untuk instance Edisi Standar). Dalam keadaan lain, tidak satu pun dari pendekatan ini akan cocok.

Paul White Reinstate Monica
sumber