Announcement

Collapse
No announcement yet.

Oracle Text und NDATA

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Oracle Text und NDATA

    Hi,

    verwendet jemand von euch Oracle Text mit einer NDATA Section für die Namenssuche? Ich versuche gerade, dass ans Laufen zu bekommen und bin, was die Performance anbelangt, nicht sonderlich begeistert.
    Verwendet wird Oracle 11.2.0.3 Ent. auf einem virtuellen Server mit 6 CPUs und 20GB SGA. Die betreffende Tabelle hat 50 Mio Einträge.
    Der Index wird wie folgt angelegt:
    Code:
    begin
    ctx_ddl.create_preference(preference_name => 'name_store',object_name=> 'MULTI_COLUMN_DATASTORE');
    ctx_ddl.set_attribute(preference_name => 'name_store',attribute_name => 'columns',attribute_value => 'NAME1,NAME3');
    ctx_ddl.create_section_group('name_sg', 'BASIC_SECTION_GROUP');
    ctx_ddl.add_ndata_section('name_sg','NAME1','NAME1');
    ctx_ddl.add_ndata_section('name_sg','NAME3','NAME3');
    end;
    /
    create index tbl0100person_ix1_3  on tbl0100person (name1)
    indextype is ctxsys.context
    parameters ('datastore name_store section group name_sg memory 100m')
    parallel 10;
    Die Abfrage sieht wie folgt aus:
    Code:
    select persno,name1,name3 from tbl0100person where contains(name1,'ndata(name3,müller) and ndata(name1,bernd)')>0
    Die Performance ist nicht gerade berauschend. Auch wenn die Abfrage mehrfach ausgeführt wird, kann es 10 oder 20 Sekunden dauern, bis ein Ergebnis kommt.
    Schränke ich die Gewichtung ein (z.B. auf 90) wird es noch schlimmer. FIRST_ROWS bringt ebenfalls keine Verbesserung.

    Verwendet ich nur eine ndata Section, ist es deutlich besser, aber in Kombination praktisch unbenutzbar. Eine Partitionierung der Tabelle wäre unglücklich, da ansonsten andere Abfragen über alle Partitionen hinweg suchen müssten. Gibt es hier noch weiteres Optimierungspotential?

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

  • #2
    Die Foren-Spezialistin dafür ist wohl Barbara Boehmer, sie antwortet auch schnell und sehr fundiert.
    Falls hier keine Antworten kommen, könntest Du es "ausnahmsweise" bei ORAFAQ probieren.

    Comment


    • #3
      Ich hab in dem Bereich keine brauchbaren Erfahrungen. Trotzdem 2 Fragen.
      Wie ist die Aktualisierungsfrequenz der Daten und wie ist die Optimierungsstrategie?
      Also wie "gut" ist der Index?
      Die SGA in der Größe nützt ja erst, wenn Oracle glaubt, dass ein ZWischenergebnis da irgendwie reingeht. Der Index bzw. seine Verwendung hat steht an der Stelle aber noch davor. Die schlechten Ergebnisse (bei Wiederholung) deuten ja auch darauf hin, dass die SGA nicht greift.
      Hier ein deutscher Link > http://oracle-text-de.blogspot.de/
      Gruß, defo

      Comment


      • #4
        @jum: Werd ich machen. Danke.

        @defo: Den Blog von Carsten kenn ich. In die SGA werden ja, mal von Direct Reads, aber doch alle Blöcke geladen.
        Ich denk aber auch, dass es nicht an der SGA liegt, sondern am Index (und damit an mir ) selbst.

        Die Daten werden einmal täglich aktualisiert allerdings nicht alle, sondern nur zwischen 1-10% der Gesamtmenge. Wir werden den Index anschließend synchronisieren und am WE Nachts neu aufbauen.

        Dim
        Zitat Tom Kyte:
        I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

        Comment


        • #5
          So, ich hab jetzt eine praktikable Lösung gefunden. Statt des Context Index verwende ich jetzt einen CTXCAT Index. Für meine Zwecke absolut ausreichend:
          Code:
          begin
           ctx_ddl.create_preference('CAT_WORDLIST', 'BASIC_WORDLIST'); 
           ctx_ddl.set_attribute('CAT_WORDLIST','FUZZY_MATCH','GERMAN');
           ctx_ddl.set_attribute('CAT_WORDLIST','PREFIX_INDEX','TRUE');
           ctx_ddl.set_attribute('CAT_WORDLIST','PREFIX_MIN_LENGTH','3');
           ctx_ddl.create_preference('CAT_LEXER','BASIC_LEXER');
           ctx_ddl.set_attribute('CAT_LEXER','MIXED_CASE','NO');
           ctx_ddl.set_attribute('CAT_LEXER','INDEX_STEMS','NONE');
           ctx_ddl.set_attribute('CAT_LEXER','ALTERNATE_SPELLING','GERMAN');
          end;
          /
          create index tbl0100person_name1ix on tbl0100person (name1) indextype is ctxsys.ctxcat parameters ('LEXER CAT_LEXER WORDLIST CAT_WORDLIST');
          create index tbl0100person_name3ix on tbl0100person (name3) indextype is ctxsys.ctxcat parameters ('LEXER CAT_LEXER WORDLIST CAT_WORDLIST');
          Die Suchen dauern jetzt auch bei "beliebten" Namen wie Meier und Huber unter 3 Sekunden, beim erneuten Ausführen unter einer Sekunde.

          Code:
          select persno,name1,name3 from tbl0100person where catsearch(name1,'mei*','')>90
          oder 
          select persno,name1,name3 from tbl0100person where catsearch(name1,'mei*','')>90 and catsearch(name3,'manf*','')>90
          Kein Problem mehr.
          Zitat Tom Kyte:
          I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

          Comment

          Working...
          X