Frage

Ich habe eine indizierte Ansicht erstellt:

CREATE VIEW LogValueTexts WITH SCHEMABINDING AS
SELECT ISNULL(LRVS_SLOG_ID*256+LRVS_IDX,0) AS ID,LRVS_VALUE AS Value
FROM dbo.LRVS_LogRecordedValues WHERE LEN(LRVS_VALUE)>4

CREATE UNIQUE CLUSTERED INDEX IX_LogValueTexts ON LogValueTexts (ID)

Auf SQL 2005 Standard SP3 dauert es ewig, um einen Volltextindex in dieser Ansicht zu füllen, da die Volltext-Indexierung die folgende Abfrage für jede Zeile in der Ansicht ausführt:

SELECT COLUMN FULLTEXTALL FROM[dbo].[LogValueTexts] WHERE COLUMN FULLTEXTKEY = @p1

Ich nehme das an COLUMN FULLTEXTALL und COLUMN FULLTEXTKEY sind eigentlich Value und ID, Aber das zeigt SQL Server -Profiler. Das Problem ist, dass der Abfrageplan einen Clustered -Index -Scan über etwa 11 Mio. Zeilen/1 GB Daten verwendet, da er den Index in der Ansicht nicht verwendet. Ich habe versucht, einen Planhandbuch für diese Abfrage zu erstellen, aber da es sich nicht um eine Standard-T-SQL-Abfrage handelt, lässt sie dies nicht zu (nicht (Incorrect syntax near the keyword 'FULLTEXTKEY').

Gibt es eine Möglichkeit, diesen Volltextindex zu bearbeiten, außer zu arbeiten, als:

  • Upgrade auf SQL 2008 (oder SQL 2005 Enterprise), wo es einwandfrei funktioniert.
  • Erstellen einer eindeutigen ID und eines Deckungsindex in der zugrunde liegenden Tabelle.

Das Upgrade würde Ausfallzeiten auf dem Server erfordern und wahrscheinlich neue SQL-Serverlizenzen beim Erstellen der eindeutigen ID und ein Abdeckindex würde viel Platz verschwendenLRVS_VALUE ist oft NULL oder hat einen sehr kurzen Textwert).

War es hilfreich?

Lösung

Ich kenne deine Daten nicht; Warum können Sie den vollständigen Textindex nicht in die Originaltabelle setzen? Sie können die berechnete Spalte in Ihre Tabellenstruktur hinzufügen. Auf diese Weise hätten Sie den Index -Wiederaufbau -Betrieb nicht (ich denke, das ist die Ursache für Ihren Scan)

Wenn Sie dies nicht tun können, wird die nächst einfachste Änderung wahrscheinlich eine Suchtabelle erstellen, die mit einer SP oder einer Auslöser -Art gefüllt ist, die Sie die Indexierung der Tabelle ändern können, sodass sie für Ihre Abfrage sinnvoll sind.

Ihre endgültige Option (und eine, die Sie einige Zeit damit verbringen müssten, um richtig zu werden) würde partitionierte Tabellen verwenden. Sie könnten eine Partition haben, die die in der Ansicht gefilterten Daten abdeckt. Volltextindex die gesamte Tabelle; Ihre Abfrage zur Laufzeit würde die partitionierte Tabelle mit den entsprechenden Daten darin treffen.

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