Volltext-Indexpopulationsleistung in einer indexierten SQL 2005-Ansicht
-
05-07-2019 - |
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).
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.