2010-09-23 9 views
10

In der Vergangenheit habe ich eine schreckliche Leistung bei der Abfrage einer varbinary (max) Spalte festgestellt. Verständlich, aber es scheint auch zu passieren, wenn überprüft wird, ob es null ist oder nicht, und ich hatte gehofft, dass der Motor stattdessen einige Abkürzungen nehmen würde.Strategien zum Überprüfen von ISNULL auf varbinary Felder?

select top 100 * from Files where Content is null 

Ich würde vermuten, dass es langsam ist, weil es

  1. Needing die ganze binäre zu ziehen, und
  2. Es ist nicht indiziert
  3. (varbinary kann nicht Teil eines normalen Index sein)

This question scheint mit meiner Prämisse der Langsamkeit hier zu widersprechen, aber ich habe immer wieder Leistungsprobleme mit binären Feldern zu haben.

Eine mögliche Lösung, die ich dachte, ist eine berechnete Spalte zu machen, dass ist indiziert:

alter table Files 
add ContentLength as ISNULL(DATALENGTH(Content),0) persisted 

CREATE NONCLUSTERED INDEX [IX_Files_ContentLength] ON [dbo].[Files] 
(
    [ContentLength] ASC 
) 

select top 100 * from Files where ContentLength = 0 

Ist das eine gültige Strategie? Welche anderen Möglichkeiten gibt es, effizient abzufragen, wenn Binärfelder beteiligt sind?

Antwort

8

Ich denke, es ist langsam, weil die Varbinary-Spalte nicht (und nicht) indexiert werden kann. Daher ist Ihr Ansatz zur Verwendung einer berechneten (und indizierten) Spalte gültig.

Allerdings würde ich stattdessen ISNULL(DATALENGTH(Content), -1) verwenden, so dass Sie zwischen Länge 0 und NULL unterscheiden können. Oder verwenden Sie einfach DATALENGTH(Content). Ich meine, Microsoft SQL Server ist nicht Oracle, wo eine leere Zeichenfolge die gleiche wie NULL ist.

2

Wir hatten ein ähnliches Problem bei der Suche nach Zeilen, bei denen ein Varbinärwert nicht null war. Für uns bestand die Lösung darin, die Statistiken für die Datenbank zu aktualisieren:

Danach liefen die Abfragen viel schneller.

Verwandte Themen