Warum wird der Aggregatoperator nach einem eindeutigen Index-Scan verwendet?

15

Ich habe eine Tabelle mit einem eindeutigen Index, der nach nicht nullwertfähigen Werten gefiltert wird. Im Abfrageplan gibt es die Verwendung von distinct. Gibt es einen Grund dafür?

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  

Abfrageplan: Bildbeschreibung hier eingeben

Mordechai
quelle

Antworten:

15

Dies ist eine bekannte Einschränkung des SQL Server-Abfrageoptimierungsprogramms. Es wurde an Microsoft gemeldet, aber das Connect-Element (nicht mehr verfügbar) wurde geschlossen. Won't Fix.

Es gibt zusätzliche Konsequenzen dieser Einschränkung, einschließlich einiger, über die ich in den Optimierer-Einschränkungen mit gefilterten Indizes geschrieben habe . Die Zusammenfassung ist unten angegeben:

In diesem Beitrag werden zwei wichtige Einschränkungen des Optimierers bei gefilterten Indizes hervorgehoben:

  • Redundante Join-Prädikate können erforderlich sein, um gefilterte Indizes abzugleichen
  • Gefilterte eindeutige Indizes liefern dem Optimierer keine Informationen zur Eindeutigkeit

In einigen Fällen kann es sinnvoll sein, die redundanten Vergleichselemente einfach zu jeder Abfrage hinzuzufügen. Die Alternative besteht darin, die gewünschten implizierten Prädikate in einer nicht indizierten Ansicht zu kapseln. Der Hash-Match-Plan in diesem Beitrag war viel besser als der Standardplan, obwohl das Optimierungsprogramm den etwas besseren Merge-Join-Plan finden sollte. Manchmal müssen Sie möglicherweise die Ansicht indizieren und NOEXPANDHinweise verwenden (ohnehin für Standard Edition-Instanzen erforderlich). Unter anderen Umständen ist keiner dieser Ansätze geeignet.

Paul White Monica wieder einsetzen
quelle