Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Die CHARINDEX vs. LIKE-Suche liefert eine sehr unterschiedliche Leistung, warum?

Ich werde meine eigene Frage beantworten, da es schwierig war, die richtige Antwort zu finden, und ich durch die Ausgabe des Ausführungsplans von SQL Server 2012 auf das Problem hingewiesen wurde. Wie Sie in der ursprünglichen Frage sehen, sieht an der Oberfläche alles in Ordnung aus. Dies ist SQL Server 2008.

Wenn ich dieselbe Abfrage auf 2012 ausführe, wurde ich auf CHARINDEX gewarnt Anfrage. Das Problem ist - SQL Server musste eine Typkonvertierung durchführen. Address1 ist VarChar und die Abfrage hat N'1124', was Unicode oder NVarChar ist . Wenn ich diese Abfrage so ändere:

SELECT * 
FROM LOCAddress 
WHERE (CAST(CHARINDEX(LOWER('1124'), LOWER([Address1])) AS int)) 

Es läuft dann genauso ab wie LIKE Anfrage. Die vom Entity Framework-Generator verursachte Typkonvertierung verursachte also diesen schrecklichen Leistungseinbruch.