2016-12-02 1 views
4
Suche

Ich habe folgenden Tabelle:Where-Klausel Index Scan - Index

CREATE TABLE Test 
(
    Id int IDENTITY(1,1) NOT NULL, 
    col1 varchar(37) NULL, 
    testDate datetime NULL 
) 

insert Test 

select null 
go 700000 

select cast(NEWID() as varchar(37)) 
go 300000 

Und unter Indizes:

create clustered index CIX on Test(ID) 
create nonclustered index IX_RegularIndex on Test(col1) 
create nonclustered index IX_RegularDateIndex on Test(testDate) 

Wenn ich auf meinem Tisch abfragen:

SET STATISTICS IO ON 
select * from Test where col1=NEWID() 
select * from Test where TestDate=GETDATE() 

Zuerst macht Index-Scan, während der zweite Index suchen. Ich erwarte, dass beide den Index suchen müssen. Warum scannt der erste Index?

enter image description here

Antwort

5

Es gibt eine implizite convert erzeugt becuase die NEWID() Funktion gibt einen Wert, der von uniqueidentifier Datentyp ist, und das ist anders als Ihr VARCHAR Datentyp für die Spalte erklärt.

Versuchen Sie einfach, die Maus über den SELECT Teil des Plans zu bewegen, wo ein "Warnzeichen" steht.

Aufgrund der Tatsache, dass es einen Unterschied zwischen verglichenen Datentypen gibt, kann der Optimierer Statistiken nicht ansehen und schätzen, wie viele Zeilen mit diesem NEWID() Wert in der Tabelle vorhanden sind.

Und wegen der impliziten convert, entscheidet das Optimierungsprogramm so, dass es besser ist, die alle Reihen gehen und bekommen (also die SCAN), so dass sie dann durch den FILTER Betrieb übergeben, wo sie eine Umrechnung des Wertes von Col1 tun zu einem uniqueidentifier-Datentyp und entfernen Sie dann die zusätzlichen Zeilen, die nicht mit der Filterbedingung übereinstimmen.

Was GETDATE() gegenüber, die einen datetime Wert zurückgibt, die aus dem gleichen Datentyp wie Ihre testDate Spalte ist, so dass keine Datentyp-Konvertierung erforderlich und kann Werte verglichen werden, wie sie sind.

+1

Weitere Informationen zu impliziten Konvertierungen, die einen Index Scan verursachen, finden Sie hier: https://www.sqlskills.com/blogs/jonathan/ implicit-conversions-that-cause-index-scans/ –

+0

Ja, gibt es Es gibt so viele Informationen über implizite Konvertierungen, ich werde versuchen, auch einige hinzuzufügen. Aber meistens ist dies einer der Schuldigen. –

+0

@OmerK Sorry, ich habe das falsch verstanden, ich meinte 'VARCHAR'. –

Verwandte Themen