[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Jan 2012
    Beiträge
    1.199

    SQL Schlüsselwort contains

    Hallo Forum,

    ich bin gerade auf das SQL-Schlüsselwort CONTAINS gestoßen. Damit soll man Textinhalte finden können. Das SQL-Handbuch sagt dazu, dass das nur funktioniert, wenn die zu durchsuchende Spalte in der Datei auf einem "textindex" bzw. "text search index" basiert. Weiß jemand, wie man so einen Index erstellt? Benötigt man dazu OMNIFIND? Zur Zeit suchen wir mit like. Aber das ist manchmal ganz schön langsam. Insbesondere, weil wir Groß/Kleinschreibung ignorieren wollen und deshalb zusätzlich lower anwenden.

    Kann jemand etwas zu contains bzw. text search index sagen?

    Vielen Dank in Voraus,
    Dieter

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Du benötigst zum einen Omnifind Text Search und musst spezielle Text Idices anlegen.

    Hier ein brandaktueller Artikel von Kent Milligan (allerdings weiß ich nicht, ob dieser Artikel für jeden zugänglich ist, ausprobieren!)
    Search Your System with IBM's OmniFind
    Index and search IFS and spool file objects
    Date Posted: June 28, 2012 06:00 AM
    Author: Kent Milligan


    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Hallo Birgitta,

    vielen Dank. Ich denke, wir werden und das OMNIFIND mal besorgen. Ich habe aber noch eine Frage. Ich habe gerade festgestellt, dass man Indizes auch mit Funktionen belegen kann. (z.B. create index index1 on Adressen(lower(name1)) Wenn man das macht, müsste eine Suche nach "name like '%meier%' doch eigentlich schneller gehen als unsere übliche Suche "lower(name) like '%meier%'". Falls das so ist: Woher weiß ich denn, welchen "lower"-Indizes ich erstellen soll. Der Index-Advisor gibt so etwas ja nicht an. Und außerdem. Wenn ich wirklich mal nach "Meier" (also inkl. Groß und Kleinbuchstaben) suchen will: Wie sage ich der Suchanfrage denn, dass er dann nicht den "lower"-Index verwenden soll?

    Dieter

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Die Geschichte mit den derived und sparsed Indices (d.h. neue Spalten und Where-Bedingungen) ist noch nicht völlig ausgereift.

    In Release 6.1 waren diese Indices fast ausschließlich für die Verwendung mit Native I/O (anstatt DDS beschriebenen logischen Dateien) gedacht.
    In einigen wenigen Fällen konnten vom Optimizer Indices verwendet werden, in denen die Where-Bedingungen genau übereinstimmen, d.h. when im SQL Statement tatsächlich WHERE Lower(Name) = oder like angegeben wurde. Der Index wurde und wird nicht verwendet wenn Name = oder like angegeben ist. Er wird auch nicht verwendet, wenn Upper(Name) = oder like angegeben ist.

    Nach und nach werden von IBM weitere Regeln unter denen derived oder sparsed Indices vom Optimizer verwendet werden können eingeführt.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Vielen Dank.

    Dieter

  6. #6
    Registriert seit
    Nov 2003
    Beiträge
    2.403
    Probier mal mit Sortierfolge *LANGIDSHR:

    1) Logische Datei mit CRTLF FILE(Bibliothek/Datei) SRTSEQ(*LANGIDSHR) anlegen

    2) STRSQL SRTSEQ(*LANGIDSHR)

    3) SELECT Name FROM Bibliothek/Datei WHERE Name LIKE '%Meier%'

  7. #7
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Wie kann ich das denn im RPG (embedded sql) verwenden? Irgenwie müsste ich dem SQL dann ja sagen, dass die Sortierfolge verwenden soll.



    Zitat Zitat von Pikachu Beitrag anzeigen
    Probier mal mit Sortierfolge *LANGIDSHR:

    1) Logische Datei mit CRTLF FILE(Bibliothek/Datei) SRTSEQ(*LANGIDSHR) anlegen

    2) STRSQL SRTSEQ(*LANGIDSHR)

    3) SELECT Name FROM Bibliothek/Datei WHERE Name LIKE '%Meier%'

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Hierzu betrachte mal den Like:

    Like '%xxx%' => Kein Index möglich!
    Like 'xxx%' => Index möglich

    Der Grund ist eben, dass ein Index ja nicht über jeden Teilschlüssel (Substring) erstellt wird sondern über den gesamten Wert.
    Ein Like '%...' erzwingt immer eine Tablescan, solange nicht andere Felder in der Whereklausel Indexverwendungen ermöglichen.

    Wenn man ähnlich klingende Schlüssel sucht, kann man SOUNDEX() verwenden, wobei hier ein ggf. vorhandener berechneter Index verwendet werden kann:

    where soundex(Namensfeld) = soundex('Meier')

    in diesem Fall werden Meier, aber auch Meyer o.ä. geliefert.

    Apropo embedded SQL:
    exec sql set options ....
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Klar, dass er nicht binär suchen kann. Aber wenn ein Index so aufgebaut wäre, dass alle Zeichen des Namens in Kleinbuchstaben gespeichert sind, könnte er den Tablescan dann ja auf dem Index machen, anstatt das echte Dateifeld zu nehmen. Das "echte" Dateifeld müsste er ja immer erst in Kleinbuchstaben umwandeln, bevor er die like-Suche auf dem feld macht.

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Hierzu betrachte mal den Like:

    Like '%xxx%' => Kein Index möglich!
    Like 'xxx%' => Index möglich

    Der Grund ist eben, dass ein Index ja nicht über jeden Teilschlüssel (Substring) erstellt wird sondern über den gesamten Wert.
    Ein Like '%...' erzwingt immer eine Tablescan, solange nicht andere Felder in der Whereklausel Indexverwendungen ermöglichen.

    Wenn man ähnlich klingende Schlüssel sucht, kann man SOUNDEX() verwenden, wobei hier ein ggf. vorhandener berechneter Index verwendet werden kann:

    where soundex(Namensfeld) = soundex('Meier')

    in diesem Fall werden Meier, aber auch Meyer o.ä. geliefert.

    Apropo embedded SQL:
    exec sql set options ....

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Ja und nein.
    Ein Indexonly-Zugriff erfolgt ausschließlich, wenn auch nur Felder im Select verwendet werden, die im Index vorkommen.

    Also ein
    "select name where name like '%xxx%'"
    mag dann schneller sein.

    Für den Indexonly-Zugriff wäre ggf. folgender Select performant, kann ich aber nicht versprechen:

    with
    xName as (
    select name
    from mytable
    where name like '%xxx%')

    select ....
    from mytable x
    inner join xName on x.name = xName.Name
    where ...
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  11. #11
    Registriert seit
    Nov 2003
    Beiträge
    2.403
    Siehe hier: http://newsolutions.de/forum-systemi...html#post57786.

    Alternativ kannst du die Sortierfolge auch im CRTSQLRPGI angeben.

    Zitat Zitat von dschroeder Beitrag anzeigen
    Wie kann ich das denn im RPG (embedded sql) verwenden? Irgenwie müsste ich dem SQL dann ja sagen, dass die Sortierfolge verwenden soll.

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Da der Default auf *JOB verweist, kann man das ebenso dynamisch per CHGJOB erreichen, halt nur mit dem Nachteil, dass dies alle Programme des Job's betrifft.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  4. sql funktion
    By steven_r in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 01-06-06, 12:16
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •