Frage

Ich habe eine Abfrage mit etwa 6-7 verknüpften Tabellen und ein FREETEXT- () Prädikat auf 6 Spalten der Basistabelle in dem where.

Nun, diese Abfrage fein gearbeitet (in weniger als 2 Sekunden) für das letzte Jahr und praktisch unverändert (i versuchte, alte Versionen und das Problem weiterhin besteht)

So heute, ganz plötzlich, die gleiche Abfrage dauert etwa 1-1,5 Minuten.

Nach dem Ausführungsplan in SQL Server überprüft 2005, den Wiederaufbau der Volltextindex der Tabelle, die Reorganisation der Volltextindex, den Index von Grund auf neu erstellen, die SQL Server-Dienst neu zu starten, den gesamten Server neu zu starten, weiß ich nicht, was sonst noch zu versuchen.

Ich schaltete vorübergehend die Abfrage Verwendung LIKE statt, bis ich diese herausfinden (die jetzt etwa 6 Sekunden dauert).

Wenn ich die Abfrage in der Abfrageleistung Analysator aussehen, wenn ich die'FREETEXT'query mit der'LIKE' Abfrage vergleichen zu können, hat die ehemaligen 350-mal so viele lesen (4.921.261 vs. 13943) und 20-mal (38.937 vs . 1938 wurde die CPU-Auslastung des letzteren).

So ist es wirklich die'FREETEXT'predicate, dass es so langsam sein verursacht.

Hat jemand eine Idee, was der Grund sein könnte? Oder weitere Tests kann ich tun?

[Bearbeiten]

Nun, ich lief nur die Abfrage erneut den Ausführungsplan zu bekommen und jetzt dauert es 2-5 Sekunden wieder, ohne Änderungen vorgenommen, obwohl das Problem noch gestern existierte. Und es war nicht aufgrund externer Faktoren, wie ich alle Anwendungen gestoppt hatte Zugriff auf die Datenbank, wenn ich das Thema am vergangenen Donnerstag zuerst getestet, so dass es nicht aufgrund irgendwelcher anderer Lasten war.

Nun, ich werde noch den Ausführungsplan enthalten, obwohl es nicht viel jetzt helfen könnte, dass alles wieder funktioniert ... Und Vorsicht, es ist eine große Anfrage an eine Legacydatenbank, dass ich nicht ändern kann (dh normalisieren Daten oder laden Sie sich von einigen unnötigen Zwischen Tabellen rid)

Abfrageplan

ok hier ist die volle Abfrage

Ich muss vielleicht erklären, was genau es tut. im Grunde wird es Suchergebnisse für Job-Anzeigen, wo gibt es zwei Arten von Anzeigen, Premium-Einsen und normalen. die Ergebnisse werden pro Seite 25 Ergebnisse paginierte, 10 Premium diejenigen bis oben und 15 Normalen danach, wenn es genug ist.

, so gibt es die beiden inneren Abfragen, die so viele Premium / Normalen wählen je nach Bedarf (zB auf Seite 10 es die Top-100-Prämie holt Einsen und Top-150 Normalen), dann werden diese zwei Abfragen mit einem row_number verschachtelt () Befehl und einige Mathematik. dann wird die Kombination von rownumber bestellt und die Abfrage zurückgegeben wird. gut ist es an einem anderen Ort, um einfach zu erhalten die 25 Anzeigen für die aktuelle Seite benötigt verwendet.

Oh, und diese ganze Abfrage werden in einer riesigen Erbe Coldfusion-Datei aufgebaut und wie es in Ordnung worden funktioniert, ich habe es nicht gewagt thouching / Ändern große Teile so weit ... nie ein laufendes System berühren und so weiter;) Nur kleines Sachen wie das Ändern Bits der zentralen where-Klausel.

Die Datei andere Abfragen auch, die gleich im Grunde tun erzeugt, aber ohne die Prämie / Nicht Prämie Unterscheidung und vielen anderen Variationen dieser Abfrage, also ist ich nie ganz sicher, wie ein Wechsel zu einem von ihnen könnte das ändern andere ...

Ok, wie das Problem nicht wieder aufgetaucht, habe ich Martin die Prämie, als er das sehr hilfreich gewesen ist, so weit und ich wollte nicht die Prämie unnötig verfallen. Vielen Dank an alle anderen für ihre Bemühungen, ich werde Ihre Vorschläge versuchen, wenn es wieder passiert:)

War es hilfreich?

Lösung

Dieses Problem könnte durch eine schlechte Mächtigkeit Schätzung der Anzahl der Ergebnisse entstehen, die für die JOIN-Operationen zu einer schlechten Strategie führt durch die Volltextabfrage zurückgegeben werden.

Wie finden Sie Leistung, wenn Sie es in 2 Stufen brechen?

Ein neuer Schritt, die mit den Ergebnissen der Volltextabfrage und die zweite Änderung Ihrer bestehenden Abfrage beziehen sich auf die temporäre Tabelle stattdessen eine temporäre Tabelle oder Tabellenvariable auffüllt.

(Hinweis: Vielleicht möchten Sie diese JOIN versuchen, mit und ohne OPTION(RECOMPILE) während bei Abfragepläne der Suche nach (A) eine Freitextsuche Begriff, dass die Renditen viele Ergebnisse (B) Eines, das gibt nur eine Handvoll von Ergebnissen.)

Bearbeiten Es ist schwierig, genau in Abwesenheit der betreffenden Abfrage zu klären, aber was ich meine ist anstatt das zu tun

SELECT <col-list>
FROM --Some 6 table Join
WHERE FREETEXT(...);

Wie wirkt sich das durchführen?

DECLARE @Table TABLE
(
<pk-col-list>
)
INSERT INTO @Table
SELECT PK
FROM YourTable
WHERE FREETEXT(...)

SELECT <col-list>
FROM --Some 6 table Join including onto @Table
OPTION(RECOMPILE)

Andere Tipps

Normalerweise, wenn wir dieses Problem haben, ist es wegen der Tabellenfragmentierung und veralteter Statistiken über die Indizes in Frage.

Das nächste Mal versuchen, EXEC sp_updatestats nach einer Wiederherstellung / reindex.

Siehe Statistiken mithilfe von Query Performance-Verbesserung für weitere Informationen .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top