Oracle 9.2; auf BLOB index erstellen

tplanitz

Erfahrenes Mitglied
Hallo,

folgende frage stellt sich für die DB: finde die nachrichten die in einem bestimmten zeitraum versendet wurden und deren erste 4 Byte einem suchmuster entsprechen.
Fragen:
-- Wie kann man eine Spalte indizieren (Nur die ersten 4 Bytes, die haben das Suchmuster) in der sich ein BLOB type befindet?
Ich habe das folgendermaßen gemacht aber leider wird der Index nicht benutzt, es werden auch nicht die anderen indexe benutzt in der abfrage unten, nur wenn ich die BLOB bedingung auskommentiere.
Code:
-- Funktion zum herstellen das die daten deterministich sind
create or replace function f_blobtrunc(val blob)
return raw deterministic as
retval raw(4);
begin
retval := dbms_lob.substr(val, 4, 1);
return retval;
end;
/
-- function based index creieren
 CREATE INDEX idx_Blob ON t_daten (f_blobtrunc(a_data)) compute STATISTICS
-- Wird dadurch der Materialized view gestört (Meine Basistabellen werden durch einen MV realisiert der immer alle 10 Minuten refreshed wird), laut Admin führte der INDEX den ich angelgt hatte zu fehlern.

Code:
select a_telefonnummer, a_eingangs_datum,  DBMS_LOB.substr(a_data, 4, 1) a_message
from t_daten
where a_eingangs_datum > = &start_date
and a_eingangs_datum <= &end_date
and DBMS_LOB.substr(a_data, 4, 1) LIKE '0_815%'

Ich hoffe mir kann jemand helfen, die Abfrage oben ist nur ein Teilstück aus einem Programm, die Ergebnisse werden weiter verwendet und mit anderen Abfragen gejoint.

Vielen Dank vorab
 
Dein Index sieht so ganz ok aus, hat bei mir zumindest keine Fehler erzeugt. Es ist aber klar, dass er ihn bei deiner Abfrage nicht benutzt.
Ein Function Based Index kann nur dann genutzt werden, wenn du in deiner Abfrage genau die selbe Funktion aufrufst, wie der Index indiziert hat:

SQL:
select  a_telefonnummer, a_eingangs_datum,  DBMS_LOB.substr(a_data, 4, 1) a_message
from    t_daten
where   a_eingangs_datum > = &start_date
and     a_eingangs_datum <= &end_date
and     f_blobtrunc(a_data) = '0_815';
 
Zuletzt bearbeitet von einem Moderator:
Zurück