Verbessern der Leistung von Volltext-Abfragen in SQL Server

Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 2549443
Zusammenfassung
Dieser Artikel beschreibt eine Methode zum Verbessern der Leistung von Microsoft SQL Server-Abfragen, die Full-Text Search-Prädikate (z. B. CONTAINS und CONTAINSTABLE) verwenden und auch filtern, die Daten. Diese Methode wird z. B. verbessert die Leistung der folgenden Abfrage:
select * from dbo.ftTest where CONTAINS(TextData, '"keyword"') and CDate > @date
Diese Methode können Sie die Abfrage entwerfen, Tabellenschema und Volltext-Index so, dass die Ergebnisse die Volltext-Suchmaschine herausgefiltert werden, bevor sie an das relationale Modul gesendet werden. Aus diesem Grund muss das relationale Modul kein großes Dataset zu filtern.
Weitere Informationen
Bei der Erstellung einer Volltextsuche-Abfrage der Faktor Prinzip, dass wirkt sich auf die Leistung der Abfrage die Menge der Daten, die die Volltext-Suchmaschine müssen ist, bevor Sie die verbleibenden verarbeiten werden Daten an das relationale Modul gesendet. In SQL Server können Sie die Leistung der Abfrage verbessern, durch die Filterung frühzeitig Zeilen reduzieren die Anzahl der Zeilen, die später verarbeitet werden müssen.

In Versionen von SQL Server vor SQL Server 2008 veröffentlicht wurden, die Volltext-Suchmaschine gibt alle Zeilen, die mit einen Suchbegriff übereinstimmen und das relationale Modul wendet dann alle Filter. Um dieses Verhalten in SQL Server 2008, SQL Server 2008 R2 und SQL Server 2012 Verbesserungen. Es ist jedoch schwierig, diese Verbesserungen zu verwenden, da die Full-Text Search Indizes von Datenbankindizes sehr unterschiedlich strukturiert sind. Darüber hinaus arbeiten die Volltext-Suchmaschine und das relationale Modul sehr unterschiedlich. Daher verwendet die Methode, die dieser Artikel beschreibt die Table-Valued (TVF) Zeilen frühzeitig herausfiltern und reduzieren die Anzahl der Zeilen, die später verarbeitet werden müssen.

Beispielsweise gibt der folgende Abfrage-Plan 131051 Zeilen, die eine Suchzeichenfolge enthält. Außerdem führt ein Join-Operator im Plan weitere Filterung über eine Indexsuche.
Rows StmtText -------------------- -----------------------------------------------------------------------------------------------------------1167 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate> '08/05/2019' 1167 |--Merge Join(Left Semi Join, MERGE:([FTSdb].[dbo].[fttest].[ID])=(FulltextMatch.[docid]), RESIDUA5858 |--Sort(ORDER BY:([FTSdb].[dbo].[fttest].[ID] ASC)) 5858 | |--Clustered Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[clidx1]), SEEK:([FTSdb].[131051 |--Table-valued function 
Wenn die Abfrage die Volltextindex eindeutige Schlüsselspalte als ein Prädikat enthält, die Volltext-Suchmaschine das Prädikat können jedoch zum Filtern der Ergebnisse auf der Full-Text-Ebene. In diesem Fall gibt die TVF eine viel kleinere Datenmenge bevor zusätzliche Filterung angewendet werden muss. Z. B. die folgende Abfrage gibt fünf Werte, die die c2-Bedingung erfüllen müssen, und die TVF gibt nur diejenigen Ergebnisse, die die fünf Werte entsprechen:
Rows StmtText -------- ---------------------------------------------------------------------------------------------------------------------------------5 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate > '08/05/2019' and ID in ( 654051, 644051, 649106, 465, 105)5 |--Nested Loops(Left Semi Join, OUTER REFERENCES:([FTSdb].[dbo].[fttest].[ID])) 5 |--Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[idx1]), SEEK:([FTSdb].[dbo].[fttest].[ID]=(105) OR ...5 |--Table-valued function
Die Volltext-Suchmaschine ist Pushdown die Werte, die durch den eindeutigen Index-Schlüssel verwendet werden die Grundlage für die folgende Methode.

Wenn ein Prädikat eine Spalte des Datentyps DateTime enthält, können Sie Datumsinformationen in der Schlüsselspalte eindeutigen Index einschließen, so dass nur die Zeilen, die dieses Prädikat entsprechen ausgegeben werden. Zu diesem Zweck müssen Sie die Datumsinformationen in der Schlüsselspalte logisch integrieren. Sie müssen jedoch auch ändern, den Datentyp der Schlüsselspalte und Anwendungen, die die Abfrage verwenden.

Um die Methode zu implementieren, ändern Sie den Datentyp des Full-Text-eindeutige ID zu BIGINT-Taste. Die ersten 4 Bytes der wichtigsten ID-Erfassung unverändert Jahr, Monat und Datumswerte aus der Datumsspalte und die letzten 4 Bytes. Z. B. das erste Byte des Schlüssels, die ID des Jahres verweisen kann, könnte das nächste Byte auf den Monat beziehen, und die letzten zwei Bytes könnte auf das Datum beziehen. Die Anwendung muss diese Änderung berücksichtigen.

Übersetzen Sie dann ein Range-Prädikat für ein Prädikat für den Schlüssel ID Z. B. das "x<>< y"="" range="" predicate="" can="" be="" translated="" to="" the="" "(x*2^32="">< id="">< y*2^32)"="" predicate.="" because="" the="" translated="" predicate="" is="" a="" predicate="" on="" the="" full-text="" key,="" the="" predicate="" will="" be="" pushed="" down="" into="" the="" full-text="" streaming="" table-valued="" functions="" (stvf).="" this="" behavior="" effectively="" performs="" searches="" within="" the="" date="">

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 2549443 – Letzte Überarbeitung: 03/22/2013 08:01:00 – Revision: 2.0

Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Enterprise Evaluation, Microsoft SQL Server 2008 R2 Datacenter, Microsoft SQL Server 2008 R2 Developer, Microsoft SQL Server 2008 R2 Enterprise, Microsoft SQL Server 2008 R2 Standard, Microsoft SQL Server 2012 Developer, Microsoft SQL Server 2012 Standard, Microsoft SQL Server 2012 Web, Microsoft SQL Server 2012 Enterprise

  • kbmt KB2549443 KbMtde
Feedback