Beschleunigung von Textabfragen durch Suchoptimierung¶
Die Suchoptimierung kann die Leistung von Abfragen verbessern, die die Funktionen SEARCH und SEARCH_IP verwenden. Diese Abfragen suchen nach Zeichendaten (Text) und IPv4-Adressen in bestimmten Spalten aus einer oder mehreren Tabellen, einschließlich Elementen in den Spalten VARIANT, OBJECT und ARRAY.
In den folgenden Abschnitten finden Sie weitere Informationen zur Unterstützung der Suchoptimierung für Textabfragen:
Bedingungen für die Laufzeitnutzung der Optimierung der FULL_TEXT-Suche
Beispiele für die ADD- (und DROP-) Optimierung der FULL_TEXT-Suche
Aktivieren der Suchoptimierung für Textabfragen¶
Um die Leistung von Textabfragen in einer Tabelle zu verbessern, verwenden Sie die Klausel ON FULL_TEXT in dem Befehl ALTER TABLE … ADD SEARCH OPTIMIZATION für bestimmte Spalten. Wenn Sie die Suchoptimierung auf Tabellenebene aktivieren, wird sie nicht für Abfragen aktiviert, die die Funktion SEARCH oder SEARCH_IP verwenden.
Beispiel:
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(play, character, line);
Weitere Informationen dazu finden Sie unter Aktivieren und Deaktivieren der Suchoptimierung.
Bedingungen für die Laufzeitnutzung der Optimierung der FULL_TEXT-Suche¶
Nachdem Sie die FULL_TEXT-Suchoptimierung für eine Tabelle aktiviert haben, die mit der Funktion SEARCH abgefragt wird, kann der Suchzugriffspfad für die Optimierung während der Planung und Ausführung der Abfrage verwendet werden. Die folgenden Bedingungen müssen erfüllt sein:
Die Suchoptimierung muss einsatzbereit sein (
active
-Spalte = TRUE in der Ausgabe DESCRIBE SEARCH OPTIMIZATION).Die Suchoptimierung muss für eine Obermenge der im Prädikat SEARCH angegebenen Spalten aktiviert werden. Wenn zum Beispiel eine Tabelle VARCHAR-Spalten
c1,c2,c3,c4,c5
enthält, die Suchoptimierung Spaltenc1,c2,c3
abdeckt und die Funktion eine, zwei oder drei dieser Spalten durchsucht (aber nichtc4
oderc5
), kann die Abfrage von der FULL_TEXT-Suchoptimierung profitieren.Der Analysator, der für die Suchoptimierung im Befehl ALTER TABLE definiert wurde, muss mit dem im Funktionsaufruf SEARCH angegebenen Analysator übereinstimmen.
Tipp
Um herauszufinden, ob ein bestimmter Suchzugriffspfad für eine Abfrage verwendet wurde, suchen Sie im Abfrageprofil nach einem Search Optimization Access
-Knoten.
Beispiele für die ADD- (und DROP-) Optimierung der FULL_TEXT-Suche¶
Die folgenden Beispiele zeigen, wie Sie die FULL_TEXT-Suchoptimierung für Spalten in einer Tabelle aktivieren, um die Abfrageleistung zu verbessern, wenn die SEARCH-Funktion zur Abfrage dieser Spalten verwendet wird.
FULL_TEXT-Suchoptimierung mit einem bestimmten Analysator aktivieren¶
Das folgende Beispiel aktiviert die Optimierung der FULL_TEXT-Suche für eine Spalte und gibt einen Analysator an. Die Kombination aus Optimierungstyp und Analysator (method
) spiegelt sich in der Ausgabe von DESCRIBE wider.
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(line, ANALYZER => 'UNICODE_ANALYZER');
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
| 1 | FULL_TEXT UNICODE_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+--------+------------------+--------+
Wenn Sie die FULL_TEXT-Suchoptimierung für dieselbe Spalte mit dem Standard-Analysator aktivieren, gibt die Ausgabe DESCRIBE zwei Zeilen aus und unterscheidet die beiden Einträge nach Ausdrucks-ID und Methode.
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(line);
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
| 1 | FULL_TEXT UNICODE_ANALYZER | LINE | VARCHAR(2000) | true |
| 2 | FULL_TEXT DEFAULT_ANALYZER | LINE | VARCHAR(2000) | false |
+---------------+----------------------------+--------+------------------+--------+
FULL_TEXT-Suchoptimierung in einer VARIANT-Spalte aktivieren¶
Der folgende Befehl aktiviert die Optimierung der FULL_TEXT-Suche in einer VARIANT-Spalte. (Diese car_sales
-Tabelle und ihre Daten werden unter Abfragen von semistrukturierten Daten beschrieben.)
ALTER TABLE car_sales ADD SEARCH OPTIMIZATION
ON FULL_TEXT(src);
DESCRIBE SEARCH OPTIMIZATION ON car_sales;
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | SRC | VARIANT | true |
+---------------+----------------------------+--------+------------------+--------+
Aktivieren Sie FULL_TEXT-Suchoptimierung auf einer OBJECT-Spalte¶
Das folgende Beispiel aktiviert die FULL_TEXT-Suchoptimierung für eine OBJECT-Spalte.
Erstellen Sie zunächst eine Tabelle mit einer OBJECT-Spalte und fügen Sie Daten ein:
CREATE OR REPLACE TABLE so_object_example (object_column OBJECT);
INSERT INTO so_object_example (object_column)
SELECT OBJECT_CONSTRUCT('a', 1::VARIANT, 'b', 2::VARIANT);
Der folgende Befehl aktiviert die FULL_TEXT-Suchoptimierung für die OBJECT-Spalte.
ALTER TABLE so_object_example ADD SEARCH OPTIMIZATION
ON FULL_TEXT(object_column);
DESCRIBE SEARCH OPTIMIZATION ON so_object_example;
+---------------+----------------------------+---------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+---------------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | OBJECT_COLUMN | OBJECT | true |
+---------------+----------------------------+---------------+------------------+--------+
Aktivieren Sie FULL_TEXT-Suchoptimierung auf einer ARRAY-Spalte¶
Das folgende Beispiel aktiviert die FULL_TEXT-Suchoptimierung für eine ARRAY-Spalte.
Erstellen Sie zunächst eine Tabelle mit einer ARRAY-Spalte und fügen Sie Daten ein:
CREATE OR REPLACE TABLE so_array_example (array_column ARRAY);
INSERT INTO so_array_example (array_column)
SELECT ARRAY_CONSTRUCT('a', 'b', 'c');
Der folgende Befehl aktiviert die FULL_TEXT-Suchoptimierung für die ARRAY-Spalte.
ALTER TABLE so_array_example ADD SEARCH OPTIMIZATION
ON FULL_TEXT(array_column);
DESCRIBE SEARCH OPTIMIZATION ON so_array_example;
+---------------+----------------------------+--------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | ARRAY_COLUMN | ARRAY | true |
+---------------+----------------------------+--------------+------------------+--------+
FULL_TEXT-Optimierung von einer oder mehreren Spalten löschen¶
Sie können die FULL_TEXT-Optimierung für mehrere Spalten aktivieren und dann später die Optimierung für eine oder mehrere dieser Spalten aufheben. Die übrigen Spalten sind noch optimiert.
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(play, act_scene_line, character, line, ANALYZER => 'UNICODE_ANALYZER');
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+----------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+----------------+------------------+--------|
| 1 | FULL_TEXT UNICODE_ANALYZER | PLAY | VARCHAR(50) | true |
| 2 | FULL_TEXT UNICODE_ANALYZER | ACT_SCENE_LINE | VARCHAR(10) | true |
| 3 | FULL_TEXT UNICODE_ANALYZER | CHARACTER | VARCHAR(30) | true |
| 4 | FULL_TEXT UNICODE_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+----------------+------------------+--------+
ALTER TABLE lines DROP SEARCH OPTIMIZATION ON 1, 2, 3;
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
| 4 | FULL_TEXT UNICODE_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+--------+------------------+--------+
Verwenden Sie den Platzhalter (*), um die Suchoptimierung für alle qualifizierten Spalten zu aktivieren¶
Der folgende ALTER TABLE-Befehl aktiviert die Optimierung der FULL_TEXT-Suche für alle vier VARCHAR-Spalten in der Tabelle lines
:
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(*);
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+----------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+----------------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | PLAY | VARCHAR(50) | true |
| 2 | FULL_TEXT DEFAULT_ANALYZER | ACT_SCENE_LINE | VARCHAR(10) | true |
| 3 | FULL_TEXT DEFAULT_ANALYZER | CHARACTER | VARCHAR(30) | true |
| 4 | FULL_TEXT DEFAULT_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+----------------+------------------+--------+
Erwarteter Fehler bei der Aktivierung der FULL_TEXT-Optimierung¶
Der folgende ALTER TABLE-Befehl schlägt mit einem erwarteten Fehler fehl, da eine der angegebenen Spalten eine NUMBER-Spalte ist:
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(play, speech_num, act_scene_line, character, line);
001128 (42601): SQL compilation error: error line 1 at position 76
Expression FULL_TEXT(IDX_SRC_TABLE.SPEECH_NUM) cannot be used in search optimization.