Oracle TEXT Internals, Tipps & Tricks

Ähnliche Dokumente
Fuzzy-Suche in Application Express

<Insert Picture Here> Mehr Ergebnisse: Linguistische und Ähnlichkeitssuche mit SQL Carsten Czarski ORACLE Deutschland B.V. & Co KG

Mehr als einfache Texte Alleskönner ORACLE TEXT

Carsten Czarski, Nina Neuwirth Oracle Deutschland. Volltextsuche in XML-Dokumenten mit Oracle

Oracle Text: AllesTextOderWas?

Oracle Text eine Oracle Perle

Ulrike Schwinn Dipl.-Math. Oracle Deutschland GmbH. Kultur und Informatik - Datenverwaltung 04.Juli 2007

Oracle Index Tuning &Admin

Üben von DDL und DML. Ergebnis:

Neues in Oracle Text

Partitioning mit Oracle Text 9i

Geodaten und Karten in APEX

Oracle Text AllesTextOderWas?

Erzeugung und Veränderung von Tabellen

Oracle 10g Einführung

XML in der Oracle Datenbank

Oracle Database 12c Was Sie immer schon über Indexe wissen wollten

Performance in der Oracle Datenbank von Anfang an

Vorlesung Datenbankmanagementsysteme

Row Chaining & Row Migration Alte Bekannte - immer noch aktuell! DOAG 2014 Datenbank Dierk Lenz

<Insert Picture Here> Security-Basics. Privilegien, Rollen, SQL und PL/SQL - inkl. 12c-Update. Carsten Czarski, ORACLE Deutschland B.V. Co.

MySQL-Befehle. In diesem Tutorial möchte ich eine kurze Übersicht der wichtigsten Befehle von MySQL geben.

Neuerungen in Marco Patzwahl MuniQSoft GmbH Unterhaching

Das Leben der Anderen

[ SQL] Wissen, das sich auszahlt

7. XML-Datenbanksysteme und SQL/XML

Übersicht der wichtigsten MySQL-Befehle

Abfragen (Queries, Subqueries)

Hochschule Karlsruhe Technik und Wirtschaft Anhänge: Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Prof. Schmidt.

XML-Datenaustausch in der Praxis Projekt TOMIS bei der ThyssenKrupp Stahl AG

WS 2010/11 Datenbanksysteme Fr 15:15 16:45 R Vorlesung #3. SQL (Teil 1)

7. XML-Datenbanksysteme und SQL/XML

Oracle Text. Katerina Mpalaska Senior Sales Consultant Server Technologies Competence Center Stuttgart. Oracle Deutschland GmbH

SQL für Trolle. mag.e. Dienstag, Qt-Seminar

Praktische SQL-Befehle

Übung PL/SQL Trigger Lösungen

Datenbank und Tabelle mit SQL erstellen

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

MCSA: SQL 2016 Database Development

<Insert Picture Here> Oracle Spatial Die Plattform für Geo-Business-Intelligence. Carsten Czarski ORACLE Deutschland B.V. & Co KG

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion

REST Services in APEX Anwendungen nutzen

Neue Features Oracle Database 12.2 Wann denn endlich?

Oracle native json Support. Erste Schritte

XML in der Oracle Datenbank "relational and beyond"

Oracle Spatial: Tipps, Tricks, Best practice

XML-Dokumente und die Oracle-Datenbank

Roland Tilgner. Solution Architects & Team Coaching DEVELOPMENT. ORACLE TEXT AUS PL/SQL-SICHT Features und Möglichkeiten

Es geht also im die SQL Data Manipulation Language.

Anwendungsentwicklung Datenbanken SQL. Stefan Goebel

Automatisierte Datenmigration mit dynamischen SQL

Warum wird mein Index nicht benutzt?

ISU 1. Ue_08/02_Datenbanken/SQL. 08 Datenbanken. Übung. SQL Einführung. Eckbert Jankowski.

Berechnung von Kennzahlen mit der SQL Model Clause

Oracle Datenbank 11g Advanced Compression Option

C++ Anwendungskurs Tag 4: Datenbanken Daniela Horn Institut für Neuroinformatik Real-time Computer Vision

Oracle PL/SQL für Experten - Performance Analyse und Laufzeitoptimierung

5.8 Bibliotheken für PostgreSQL

Mehr Ergebnisse: Linguistische Funktionen und Ähnlichkeitssuche mit SQL. Carsten Czarski ORACLE Deutschland B.V. & Co KG München

DOAG Index Tuning

Inhalt. Ein Einführung in die Nutzung von SQL-Datenbanken am Beispiel Oracle. Daten und Tabellen - ein Beispiel. Daten und Tabellen - Normalisierung

Relationales Datenbanksystem Oracle

Einführung in SQL. 1. Grundlagen SQL. Structured Query Language. Viele Dialekte. Unterteilung: i. DDL (Data Definition Language)

Oracle SQL. Seminarunterlage. Version vom

Inhaltsverzeichnis. Inhalt. 1 Einführung in die Datenbanktechnologie

Oracle 9i Einführung Performance Tuning

7. XML-Datenbanksysteme und SQL/XML

Online Table Shrink. Freigabe von ungenutztem Speicherplatz. Autor: Ralf Durben, ORACLE Deutschland GmbH

SQL (Structured Query Language) Schemata Datentypen

Triggern. Change Data Capture

Objektorientierung in Oracle

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2

10 Gründe warum Ihr Index nicht verwendet wird

Grundlagen von SQL. Informatik 2, FS18. Dr. Hermann Lehner (Material von Dr. Markus Dahinden) Departement Informatik, ETH Zürich

XML-Abfragen der neuen Art: XQuery

5/14/18. Grundlagen von SQL. Grundlagen von SQL. Google, Facebook und Co. setzen auf SQL. Whatsapp

Inhaltsverzeichnis. Vorwort 13

Auf einen Blick. Abfrage und Bearbeitung. Erstellen einer Datenbank. Komplexe Abfragen. Vorwort... 13

NoSQL mit Postgres 15. Juni 2015

Datenbanken SQL. Insert, Update, Delete, Drop. Krebs

Tempo, Sicherheit und Komprimierung Neue Möglichkeiten der LOBs mit ORACLE 11g SecureFiles STCC Düsseldorf, Oracle Deutschland GmbH

Automatisierung von Tabellen- und Index-Reorganisationen

Transkript:

Oracle TEXT Internals, Tipps & Tricks Ulrike Schwinn Carsten Czarski Business Unit Database ORACLE Deutschland GmbH

Text-Dokumente in der Datenbank Oracle TEXT Volltextrecherche "State-of-the-Art" Linguistische Suchfunktionalität Stemming, Base-Letter, Thesaurus-Suche, Phrasensuche, Stopwort-Listen,... Dokumente innerhalb und außerhalb der Datenbank FILE_DATASTORE, URL_DATASTORE Erweiterungen für Text Mining Klassifizierung, Clustering Ansprache mit SQL CREATE INDEX SELECT... WHERE CONTAINS...

Oracle TEXT Indizierung... Unterstützung aller gängigen Datentypen XMLTYPE, VARCHAR2, CLOB, BLOB,... Filter bei Binärdaten möglich Auch mehrere Indizes pro Tabelle SQL> create index idx_textindex 2 on dokument_tab (dokument) 3 indextype is CTXSYS.CONTEXT 4 / Index created. HINTERGRUND: Extensible Indexing Framework Spatial, TEXT, Expression Filter Eigene Indizes möglich

Oracle TEXT Volltextrecherche Abfrage mit SQL CONTAINS-Funktion Kombinierbar mit relationalen Abfragen Relevanz-Ranking anhand Wort-Häufigkeiten SCORE()-Funktion Ergebnis-Aufbereitung Highlighting "Keyword-in-Context" select score(1), dokument from dokument_tab where CONTAINS(dokument, 'Software AND Oracle')>0 /

Häufige Fragen... Was passiert eigentlich im Index...? Wie kann ich den Index überwachen...? Indexfragmentierung: Was tun...? Strategien zur Index-Synchronisierung...? Mixed Queries: Was tun...? Sortierungen: Was tun...?

Grundlagen Aufbau eines TEXT Index DR$[Indexname]$I Token-Tabelle: Enthält alle Tokens mit (binären) Informationen über die Dokumente, in denen sie vorkommen. DR$[Indexname]$R Mapping-Tabelle DOCID ROWID DR$[Indexname]$K Mapping-Tabelle ROWID DOCID DR$[Indexname]$N Negativliste: Enthält alle gelöschten DOCID's DR$[Indexname]$P Substring-Index (wenn aktiviert)

Aufbau eines Oracle TEXT-Index Token-Tabelle ($I) Tabellenaufbau Name Null? Type ----------------- -------- ------------ TOKEN_TEXT NOT NULL VARCHAR2(64) TOKEN_TYPE NOT NULL NUMBER(3) TOKEN_FIRST NOT NULL NUMBER(10) TOKEN_LAST NOT NULL NUMBER(10) TOKEN_COUNT NOT NULL NUMBER(10) TOKEN_INFO BLOB

Aufbau eines Oracle TEXT-Index Token-Tabelle ($I) Eine Ausgangssituation ID TEXT 1 1001 Nacht und Tag, Tag und Nacht 2 1002 Es war eine stürmische Nacht ROWID: AAASWTAAFAAACGAACo ROWID: AAASWTAAFAAACGAAC4 DOCID: DOCID: TOKEN_TEXT TOKEN_INFO (BLOB) NACHT (DOCID 1, INFO 1,2)(DOCID 2, INFO 3) TAG (DOCID 1, INFO 4,5) STÜRMISCHE (DOCID 2, INFO 6)

Grundlagen Verwendung von DOCID's Oracle TEXT verwendet intern DOCID's DOCID ist kompakter als ROWID Faktor ~10:1 Prozeß bei einer Query: Token-Suche ROWID-Lookup Dokument-Lookup DOCID ROWID $I-Tabelle $R-Tabelle Dokument-Tabelle

Verwendung von DOCID's Verhalten bei DML INSERT Erzeugung einer neuen DOCID Neue Zeile(n) in Token-Tabelle ($I) für neue Tokens Neue Zeile in Mapping-Tabellen ($N,$R) Vorgehensweise Token-Tabelle... Idealfall wäre: Einpflegen in bestehende Zeilen, wenn Token bereits vorhanden sind Problem dabei: Einpflegevorgang (SQL UPDATE auf BLOB) zu teuer, daher neue Zeilen (SQL INSERT)

Verwendung von DOCID's Verhalten bei DML DELETE Löschen der DOCID aus den Mapping-Tabellen ($K, $R) Eintrag in Negativlisten-Tabelle ($N) Token-Tabelle ($I) bleibt unverändert Vorgehensweise... Idealfall wäre: Löschen aller Einträge direkt aus der Token-Tabelle Problem dabei: Löschvorgang (SQL UPDATE auf BLOB) zu teuer, daher keine Aktion

Oracle TEXT und SQL UPDATE Default-Verhalten Behandlung wie DELETE und INSERT Grund: In-Place-Pflege der Token-Tabelle zu teuer Problem: UPDATES führen zur Index-Fragmentierung Bedarf nach OPTIMIZE bzw. REBUILD Lösungsansatz: MDATA-Sections (Oracle10g)

MDATA-Sections... oder Metadaten-Bereiche Anwendung für "getaggte" Dokumente XML, HTML,... Keine Zerlegung in Tokens Eigenständiges UPDATE möglich begin ctx_ddl.add_mdata_section( group_name => 'mysg', section_name => 'branchid', tag => 'branch-id'); end;

Metadaten-Bereiche Ausgangssituation: ohne MDATA-Sections 1a. Ausgangsituation ID TEXT 1001 <text>nacht und Tag, Tag und Nacht</text> <branch-id>90</branch-id> 1002 <text>es war eine stürmische Nacht</text> <branch-id>92</branch-id> TOKEN_TEXT TOKEN_TYPE NACHT 1 (NORMAL) TAG 1 (NORMAL) 90 1 (NORMAL) 92 1 (NORMAL)

Metadaten-Bereiche Ausgangssituation: ohne MDATA-Sections 1b. Reguläres SQL-UPDATE ID TEXT 1001 <text>nacht und Tag, Tag und Nacht</text> <branch-id>90</branch-id> 1002 <text>es war eine stürmische Nacht</text> <branch-id>91</branch-id> TOKEN_TEXT TOKEN_TYPE NACHT 1 (NORMAL) TAG 1 (NORMAL) 90 1 (NORMAL) 92 1 (NORMAL)

Metadaten-Bereiche Ausgangssituation: ohne MDATA-Sections 1c. Index Synchronize ID TEXT 1001 <text>nacht und Tag, Tag und Nacht</text> <branch-id>90</branch-id> 1002 <text>es war eine stürmische Nacht</text> <branch-id>91</branch-id> TOKEN_TEXT TOKEN_TYPE NACHT 1 (NORMAL) TAG 1 (NORMAL) 90 1 (NORMAL) 92 1 (NORMAL)(N-Table) 91 1 (NORMAL)

Metadaten-Bereiche Ausgangssituation: ohne MDATA-Sections 1d. Index Optimize ID TEXT 1001 <text>nacht und Tag, Tag und Nacht</text> <branch-id>90</branch-id> 1002 <text>es war eine stürmische Nacht</text> <branch-id>91</branch-id> TOKEN_TEXT TOKEN_TYPE NACHT 1 (NORMAL) TAG 1 (NORMAL) 90 1 (NORMAL) 91 1 (NORMAL)

MDATA Sections Effizientes Metadaten-UPDATE 2a. Ausgangsituation mit MDATA ID TEXT 1001 <text>nacht und Tag, Tag und Nacht</text> <branch-id>90</branch-id> 1002 <text>es war eine stürmische Nacht</text> <branch-id>92</branch-id> TOKEN_TEXT TOKEN_TYPE NACHT 1 (NORMAL) TAG 1 (NORMAL) 90 400 (MDATA) 92 400 (MDATA)

MDATA Sections Effizientes Metadaten-UPDATE 2b. MDATA-Update ID TEXT 1001 <text>nacht und Tag, Tag und Nacht</text> <branch-id>90</branch-id> 1002 <text>es war eine stürmische Nacht</text> <branch-id>92</branch-id> TOKEN_TEXT TOKEN_TYPE NACHT 1 (NORMAL) TAG 1 (NORMAL) 90 400 (MDATA) 92 400 (MDATA) 92-400 (MDATA) 91-400 (MDATA)

MDATA Sections Effizientes Metadaten-UPDATE 2c. Index Optimize ID TEXT 1001 <text>nacht und Tag, Tag und Nacht</text> <branch-id>90</branch-id> 1002 <text>es war eine stürmische Nacht</text> <branch-id>92</branch-id> TOKEN_TEXT TOKEN_TYPE NACHT 1 (NORMAL) TAG 1 (NORMAL) 90 400 (MDATA) 91 400 (MDATA)

MDATA Sections PL/SQL Prozeduren für Update MDATA-Section ändern ctx_ddl.remove_mdata( idx_name => 'myidx', section_name => 'branchid', mdata_value => '1', mdata_rowid => v_rowid ); ctx_ddl.add_mdata( idx_name => 'myidx', section_name => 'stocklevel', mdata_value => '0', mdata_rowid => v_rowid );

MDATA Sections Seiteneffekte und Hinweise... MDATA-Update betrifft nur den Index Betroffen ist nur die Token-Tabelle Index und Originaldaten sind "out-of-sync" MDATA-Update fügt neue Zeilen hinzu Negative Token-Types (-400) sind Deltas Eliminierung bei Index Optimize MDATA-Update ist immer Remove und Add

MDATA-Sections Strategie zur Vermeidung von "mixed Queries" Mehrere Tabellen bzw. Tabellenspalten Unstrukturierte Daten in CLOB/BLOB/XMLTYPE Strukturierte Metadaten in relationalen Spalten Zusammenfassung per User-Data-Store Volltextindex erfasst alle Daten Metadaten als MDATA-Sections Metadaten-Update SQL-UPDATE auf relationale Tabellenspalte MDATA-Update (per Trigger) Vorteile: Vermeidung von "mixed Queries" Metadaten-Update ohne Index-Sync möglich

Indexfragmentierung DML-Aktivität führt zu fragmentiertem Index TOKEN_INFO-Felder (BLOB) suboptimal befüllt Gelöschte Dokumente (Garbage) in Token-Tabelle Lösungsansätze... Geeignetes Synchronisierungs-Intervall ACHTUNG: Neue Option: ON_COMMIT in 10g Regelmäßiges OPTIMIZE_INDEX Wichtig dabei: Regelmäßiges Monitoring Zusätzlich: Transaktionale Indizes In-Memory-Indizierung der Zeilen in CTX_PENDING

Indexfragmentierung OPTIMIZE_INDEX CTX_DDL.OPTIMIZE_INDEX Optimierungs-Ebene OPTLEVEL_FAST OPTLEVEL_FULL OPTLEVEL_REBUILD Optimierungs-Tiefe OPTLEVEL_TOKEN OPTLEVEL_TOKEN_TYPE "Verdichtung" der Token-Tabelle Keine Entfernung gelöschter Tokens "Verdichtung" der Token-Tabelle Entfernung gelöschter Tokens Index Rebuild schneller als OPTLEVEL_FULL

Oracle TEXT Monitoring Allgemeines... Optimizer-Statistiken sammeln (empfohlen) DBMS_STATS.GATHER_..._STATS PL/SQL Paket CTX_REPORT DESCRIBE_INDEX INDEX_SIZE INDEX_STATS Ausgabeformate Plain TEXT XML ACHTUNG: Vollständiger Index-Scan Lange Laufzeit bei großen Indizes

Monitoring Ausgabe von CTX_REPORT Plain-Text-Ausgabe ------------------------------------------------------------- FRAGMENTATION STATISTICS ------------------------------------------------------------- total size of $I data: 278,859 (272.32 KB) $I rows: 28,975 estimated $I rows if optimal: 17,776 estimated row fragmentation: 39 % garbage docids: 0 estimated garbage size: 0 most fragmented tokens: GE (0:TEXT) 92 % ERMOGLICHT (0:TEXT) 92 % DURCH (0:TEXT) 92 % DE (0:TEXT) 92 % ALLEN (0:TEXT) 92 %

Oracle TEXT Monitoring Beispiel: Enterprise-Manager-Integration Vorgehensweise CTX_REPORT XML-Ausgabe Datenextraktion in View Integration in Enterprise Manager

Monitoring Enterprise-Manager-Integration Benutzerdefinierte Metriken Definition der Schwellenwerte Definition Aktualisierungsintervall ACHTUNG: Laufzeit beachten bei großen Indizes Weiträumige Intervalle (Tage / Wochen)

Indexerstellung Weitere Tipps & Tricks Präferenzen CTX_REPORT.CREATE_INDEX_SCRIPT Direkt nach Indexerstellung laufen lassen Grund: Änderungen an den Präferenzen Stopwörter So viele wie möglich, so wenig wie nötig Indexgröße Speicherverbrauch MEMORY-Parameter So viel wie möglich... aber bitte ohne Paging

Indexerstellung Backup-Index... Problem: Index Rebuild dauert im Verlustfall zu lange Default: Ein Index pro Tabellenspalte Lösungsansatz: USER_DATA_STORE TEXT DUMMY1 DUMMY2 USER_DATA_STORE TEXT Index auf DUMMY-Spalten

Indexerstellung Backup-Index mit USER_DATA_STORE SQL Update auf Dokument-Spalte Per RDBMS-Trigger UPDATE auf DUMMY-Spalten Index Sync Index-Auswahl bei Query select score(1), dokument from dokument_tab where CONTAINS(dummy1, 'Software AND Oracle')>0 / select score(1), dokument from dokument_tab where CONTAINS(dummy2, 'Software AND Oracle')>0 /

Indexerstellung Storage-Parameter Storage-Klauseln Tablespaces Extent-Verwaltung Achtung: R_TABLE_CLAUSE WICHTIG: "LOB (DATA) STORE AS (CACHE)" I_INDEX_CLAUSE WICHTIG: "COMPRESS 2"

Oracle TEXT Sortieren der Ergebnismenge... bspw. nach Datum Problem: Oracle TEXT liefert Ergebnisse so zurück, wie sie gefunden wurden Sortierung nach Datum muss extra erfolgen Lösungsansätze Reverse DOCID searching Partitionierung MDATA-Sections und Progressive Relaxation

Reverse DOCID Searching Sortierung einer Trefferliste (Default) Reverse DOCID (9.2) Forward DOCID (10.x) Reverse DOCID als Option verfügbar Nutzung für Datumssortierung... Dokumente werden chronologisch eingefügt Keine UPDATES Keine parallelen Index Builds Nicht verfügbar bei Progressive Relaxation Transactional Queries

Tabellen partitionieren Prinzip Aufteilung in mehrere physikalische Einheiten Nach außen eine normale Tabelle Oracle TEXT unterstützt partitionierte Tabellen Nutzen: Performance Abfragen können auf einzelne Partitionen beschränkt werden (Optimizer) Partitionen können als Einheit gelöscht oder verschoben werden

Tabellen partitionieren Nutzen für Sortierung nach Datum Partitionierungsschlüssel: Datum Relationaler Spalte Bei XML: Im Dokument (O/R Speicherung) SQL-Abfrage SELECT * FROM ( SELECT title FROM text_tab WHERE CONTAINS( dokument, 'textquery' )>0 ORDER BY datum ) WHERE ROWNUM < 20;

Tabellen partitionieren Weiterer Nutzen... "Rolling Window"-Operationen Partitionen auf einmal löschen (mit Index) Index Rebuild auf Partitionsebene Paralleles Index Build (und Rebuild) alter table dokument_tab drop partition part2005 alter index idx_volltext rebuild partition part2005

Progressive Relaxation Was ist das? Erweiterung der Textquery...... schrittweise...... bis die gewünschte Trefferzahl erreicht ist. select score(1), title from test_table where contains ( dokument, '<query> <textquery> <progression> <seq>mdata(month, 122005)</seq> <seq>mdata(month, 112005)</seq> <seq>mdata(month, 102005)</seq> :

Mehrsprachigkeit MULTI_LEXER vs. WORLD_LEXER Quelle: Metalink-Note 249991.1

Anhang: XML und Oracle TEXT SECTION GROUPS XML_SECTION_GROUP AUTO_SECTION_GROUP PATH_SECTION_GROUP Operatoren WITHIN INPATH / HASPATH

Anhang: XML und Oracle TEXT AUTO_SECTION_GROUP Prinzip: Standardmäßig vollständige Indizierung Keine Deklaration von Abschnitten erforderlich Deklaration von sog. "STOP"-Abschnitten möglich CONTAINS-Operatoren WITHIN Vorteile Implementierung einfacher Nachteile Keine XPath-ähnliche Syntax möglich

Anhang: XML und Oracle TEXT PATH_SECTION_GROUP Prinzip Stets vollständige Indizierung des Dokumentes CONTAINS-Operatoren WITHIN INPATH und HASPATH Vorteile XPath-Ähnliche Syntax möglich Einfache Implementierung Nachteile keine Möglichkeit zum Ausschließen bestimmter Abschnitte Indexumfang größer

INPATH / HASPATH XML-Standards XML Standards keine 100%-Unterstützung des Standards ABER: XPath definiert keine Volltextsuche keine Namensräume keine Unterstützung für Benutzerdefinierte Entities

Weitere Informationen Oracle Dokumentation Oracle TEXT Developers' Guide Oracle TEXT Reference Oracle Technology Network (OTN) Database Content Management Text Metalink Note 249991.1: Oracle TEXT technical Overview Note 150453.1: Strategy for creating Oracle TEXT indexes

& A Q U E S T I O N S A N S W E R S