2009-03-25 9 views
4

Ich habe die folgende Abfrage in SQL Server 2005:Hash-Join auf Volltextabfrage Zeigend - SQL Server 2005

SELECT 
    PRODUCT_ID 
FROM 
    PRODUCTS P 
WHERE 
    SUPPLIER_ORGANIZATION_ID = 13225 
    AND ACTIVE_FLAG = 'Y' 
    AND CONTAINS(*, 'FORMSOF(Inflectional, "%clip%") ') 

Interessant ist, dass diese mit einem Hash Match erzeugt während, wenn ich einen anderen SUPPLIER_ORGANIZATION_ID verwenden (älterer Lieferant), wird ein Merge-Join verwendet. Offensichtlich ist der Hash viel langsamer als der Merge-Join. Was ich nicht verstehe ist, warum es einen Unterschied gibt und was benötigt wird, um es schneller laufen zu lassen?

FYI, es gibt etwa 5 Millionen Datensätze in der Tabelle PRODUKTE. Wenn die ID der Lieferantenorganisation ausgewählt wurde (13225), gibt es etwa 25000 Produkte für diesen Lieferanten.

Vielen Dank im Voraus.

+0

SQL Server - welche Version? Fügen Sie diese Information hinzu (als Tag und vielleicht in der Frage selbst). – Tomalak

+0

SQL Server 2005. Änderungen vorgenommen. –

+0

Danke. +1 für die Frage. Ich kann es nicht sicher beantworten, aber haben Sie einen DBCC DBREINDEX und eine UPDATE STATISTICS auf dem Tisch versucht? – Tomalak

Antwort

1

Ich würde versuchen, den OPTIMIZE FOR Query-Tipp zu verwenden, um es auf die eine oder andere Weise zu erzwingen.

SELECT 
    PRODUCT_ID 
FROM 
    PRODUCTS P 
WHERE 
    SUPPLIER_ORGANIZATION_ID = @Supplier_Organisation_Id 
    AND ACTIVE_FLAG = 'Y' 
    AND CONTAINS(*, 'FORMSOF(Inflectional, @Keywords) ') 
OPTION (OPTIMIZE FOR (@Supplier_Organisation_Id = 1000)) 

Eine andere Sache ist Ihre STATISTIK veralten könnte, der Wendepunkt für automatisches Updates ist oft nicht niedrig genug, was bedeutet, dass der Abfrage-Plan für Ihre Daten nicht ideal gewählt werden. Ich würde vorschlagen, dass Sie versuchen, die STATISTIKEN in Ihrer Produkttabelle zu aktualisieren, indem Sie möglicherweise regelmäßig einen Job erstellen, um dies regelmäßig zu tun, wenn dies ein Teil des Problems ist.