2012-04-12 25 views
4

Ich habe einen Tisch mit fast 5kk Reihen. Jeder von ihnen hat eine Textspalte, wo ich meine XML-Logs speichernWie kann ich diese endlose Abfrage verbessern?

Ich versuche, um herauszufinden, ob es eine Log ist mit

<node>value</node> 

ich mit

SELECT top 1 id_log FROM Table_Log WHERE log_text LIKE '%<node>value</node>%' 

habe versucht, aber es nie beendet.

Gibt es eine Möglichkeit, diese Suche zu verbessern?

PS: Ich kann kein Protokoll falle

+0

define "nie endet" – Matten

+6

Da Sie nach 'LIKE '% ....%' suchen, haben Sie sichergestellt, dass kein Index jemals helfen wird. Also ich habe Angst - nein - es gibt wirklich nichts, was du tun kannst, um das zu beschleunigen ...Das einzige, was * helfen könnte, wäre, eine 'DATETIME'-Spalte zu haben und sie zu indizieren und dann Ihre Suche auf z.B. der letzte Monat oder so (also nur die schiere Anzahl der Zeilen zu reduzieren, um zu suchen ...) –

+0

Es dauert mehr als 10 Minuten und immer noch keine Ergebnisse – GLlompart

Antwort

1

Neben der Implementierung der Volltextsuche für diese Spalte und der Indexierung der Tabelle können Sie die Ergebnisse möglicherweise auch auf andere Parameter (Datum usw.) eingrenzen. Sie können auch ein Tabellenfeld (varchar type) namens "Tags" hinzufügen, das Sie beim Einfügen einer Zeile ausfüllen können. Dieses Feld würde "Schlüsselwörter, Tags" für dieses Protokoll registrieren. Auf diese Weise können Sie Ihre Abfrage mit diesem Feld als Bedingung ändern.

+0

Filtern nach Datum machte den Trick – GLlompart

1

Leider über die einzige Möglichkeit, die ich sehen kann zu optimieren, dass ist die Volltextsuche auf dieser Spalte zu implementieren, aber auch werden, dass schwer zu konstruieren, wo Es gibt nur einen bestimmten Wert innerhalb eines bestimmten Elements zurück.

Ich mache gerade eine Arbeit wo ich auch XML in einer der Spalten speichere. Aber ich gehe davon aus, dass Anfragen, die für diese Daten benötigt werden, sehr lange dauern werden, was unseren Anforderungen entspricht.

Eine andere Option hat mit dem Speichern der Daten in einer binären Spalte zu tun, und dann verfügt SQL Server über Optionen zum Festlegen, welche Art von Dokument in diesem Feld gespeichert ist. So können Sie beispielsweise sinnvollere Volltextsuchen in diesem Feld durchführen. Aber es ist schwer für mich, mir vorzustellen, dass dies das tun wird, was Sie verlangen.

0

Sie verwenden eine ähnliche Abfrage. Kein Index beteiligt = nicht gut Es gibt nichts, was Sie tun können, was Sie derzeit haben, um dies leider zu beschleunigen.

9

Eine Wildcard-Abfrage wie '%<node>value</node>%' führt zu einem vollständigen Tabellenscan (Indizes ignorieren), da nicht festgestellt werden kann, wo innerhalb des Feldes die Übereinstimmung gefunden wird. Der einzige wirkliche Weg, den ich kenne, um diese Abfrage so zu verbessern, wie sie ist (ohne Dinge wie Partitionierung der Tabelle usw., die berücksichtigt werden sollte, wenn die Tabelle ständig protokolliert) wäre, einen Volltext-Katalog & Index der Tabelle hinzuzufügen, um bietet eine effizientere Suche über dieses Feld.

Here ist eine gute Referenz, die Sie durch es gehen sollte. Sobald dies abgeschlossen ist, können Sie Dinge wie die CONTAINS- und FREETEXT-Operatoren verwenden, die für diese Art des Abrufs optimiert sind.

0

Ich glaube nicht, wird es helfen, sondern versuchen, die FAST x query hint wie so verwenden:

SELECT id_log 
FROM Table_Log 
WHERE log_text LIKE '%<node>value</node>%' 
OPTION(FAST 1) 

Diese die Abfrage optimieren sollte die erste Zeile zurückzukehren.