SQl oder Oracle Experte wer kann helfen

Hallo liebe Experten mein Problem:

Ich habe z.B. Anredetexte (Herr, Frau)
Länder 100 Stück
Dazu habe ich Personen zu denen will ich die Anredetext suchen.

Ein SQL Sieht z.B so aus

Select Person.Name, Anrede.Anrede_Text
FROM persoen INNER JOIN anrede ON personen.Land_ID = anrede.Land_ID and Personen.Anrede_ID = anrede.Anrede_ID;

Die Tabelle Anredetextehat den Aufbau
Land_ID, Anrede_ID, Anrede_Text

Der Anrede_Text ist 90 % der Länder gleich
Ich will nicht 100 mal alle Anrede_Text (in der Datei Anrede) anlegen.

Da ich mit ca. 500 SQL Befehlen auf die Tabelle Anrede zugreife will ich keine SQLs ändern

Meine Idee war es

In der Datei Anrede ein Land 0 Anlegen = Standard Texte für alle Länder
Und dann nur die Datensätze anlegen die von diesem Standard abweichen.

Damit keine SQLs zu ändern sind:

Die Anrede Datei umzubenennen und dafür einen View mit dem alten Namen zu erzeugen.

Der View bekommt dann übergeben:
Suche den Anrede_Text für die Land_ID 99 mit der Anrede_ID 88

Der View Sollte dann in der Physikalischen Datei Nachsehen gibt es einen Datensatz

mit Land_ID 99 mit der Anrede_ID 88 wenn keiner gefunden wurde soll er den Anrede_Text von

Land_ID 0 mit der Anrede_ID 88 suchen

Geht das ? (PL-SQL Funktion ) Ist das ein gangbarer Weg ? Wie geht das im Detail ?

(lauft unter Oracle 8.x)

Für Hilfe bin ich Lange Dankbar.

Meine Idee war es

In der Datei Anrede ein Land 0 Anlegen = Standard Texte für
alle Länder
Und dann nur die Datensätze anlegen die von diesem Standard
abweichen.

Der View bekommt dann übergeben:
Suche den Anrede_Text für die Land_ID 99 mit der Anrede_ID 88

Der View Sollte dann in der Physikalischen Datei Nachsehen
gibt es einen Datensatz

mit Land_ID 99 mit der Anrede_ID 88 wenn keiner gefunden wurde
soll er den Anrede_Text von

Land_ID 0 mit der Anrede_ID 88 suchen

Geht das ? (PL-SQL Funktion ) Ist das ein gangbarer Weg ? Wie
geht das im Detail ?

Das Statement, das Du dafür ausführen müßtest ist folgendes:

SELECT a.anrede\_text 
FROM personen p, anrede a 
WHERE p.land\_id=a.land\_id AND p.anrede\_id=a.anrede\_id
UNION
SELECT anrede\_text 
FROM personen p, anrede a 
WHERE a.land\_id=0 AND
 p.anrede\_id=a.anrede\_id AND
 NOT EXISTS (SELECT land\_id 
 FROM anrede a2 
 WHERE a2.land\_id=p.land\_id);

Keine Ahnung, ob das ‚not exists‘ SQL Standard ist, auf Oracle funktionierts auf alle Fälle.

Eine kleine Anmerkung dazu: Das so zu machen ist ein durchaus gangbarer Weg, geht aber natürlich auf Kosten der Performance, weil ja ein einfacher SELECT (idealerweise über den primary key in ‚anrede‘) durch zwei SELECTS, davon einer sogar noch mit sub-select ersetzt wird. Sollte aber keine Tragödie sein, so lange Deine Anreden-Tabelle nicht wirklich groß wird.

Ich hoffe das hilft,
TheBeast

Hi,
Gegenvorschlag zu TheBeast. Seine Lösung mag funktionieren, nur, wie er schon sagt, ist sie eine ziemliche Performancefalle (Union und Subselect in einer Abfrage).
Zusätzlich werden die Daten vergewaltigt -> nicht den Datensatz, den man findet, sondern einen anderen, wenn man den nicht findet, aber nur dann, sonst doch den - uff!).

Warum legst Du die Daten nicht so ab, wie Du sie brauchst?

Der Anrede_Text ist 90 % der Länder gleich

Ist doch völlig wurscht - für jedes Land gibt es einen, fertig.

Ich will nicht 100 mal alle Anrede_Text (in der Datei Anrede)
anlegen.

Das ist der entscheidende Punkt: warum nicht? 100 Anredendatensätze sind doch nichts, wenn sie Dir einen performancemäßigen Zugang zu deinen Daten bringen. Vergleiche Nutzen und Aufwand beider Methoden!

Gruß

J.

Nein ich brauch da etwas anders
Hi José,

Das mit den Anrede Titeln und Ländern ist nur ein Beispiel.

zum Hintergrund:

Eigendlich habe ich Mandanten (Firmen) ca 200.
und 15-20 von diesen Nachschlagetabellen und in jeder dieser Tabelle stehen 1 bis 50 Datensätze !

Das gibt schon einen Haufen doppelte Datensätze.

Es gibt ein Programm das auf diese Oracle DB zugreift.
Dieses Programm hat ca. 25 mannjahre Entwicklungszeit und zigtausend SQLs die ich nicht alle ändern will.

Hi,

In der Datei Anrede ein Land 0 Anlegen = Standard Texte für
alle Länder
Und dann nur die Datensätze anlegen die von diesem Standard
abweichen.

jein. Du hast in Deiner Länder-Tabelle eine Referenz auf die Anreden-Tabelle in Form einer n:1-Beziehung: n Länder „teilen sich“ 1 Anrede. Es gibt keinen Default-Text, sondern einfach nur einen Datensatz (oder ein paar), der häufiger benutzt wird als die anderen.

Damit keine SQLs zu ändern sind:

Hm. Eigentlich überlegt man sich das DB-Layout, bevor man es mit SQL-Statements versieht… :smile:

SELECT person.name, anrede.anrede
FROM person, land, anrede
WHERE person.ref_land = land.id
AND land.ref_anrede = anrede.id

Einfach, sauber und hygienisch :smile:

Cheatah

P.S.: Evtl. Outer Joins günstig wählen, und natürlich brauchbare Indizes (bei land und anrede auf den Primary Key ‚id‘) erstellen!

Hi again,

was red ich da?

[…]und natürlich
brauchbare Indizes (bei land und anrede auf den Primary Key
‚id‘) erstellen!

Bei derart winzigen Datenmengen wie 100 Länderchen oder 'ner Handvoll Anreden kann es u.U. (besonders bei häufig befragten Tabellen) sinnvoll sein, nicht den Umweg über einen Index zu gehen, sondern auf den Cache zu vertrauen. Das ist im Einzelfall in SQL*Plus mittels AUTOTRACE STATISTICS zu testen - wäge Consistent Gets und Physical Reads mit und ohne Indizes gegeneinander ab. Wenn es mit Index besser ist, überlege Dir, ob es nicht sinnvoll ist, z.B. in anrede neben id auch die Anrede selbst mit aufzunehmen - dann holt Oracle sich die Information direkt aus dem Index, anstatt noch die Tabelle zu bemühen.

Himmel, ich liebe Optimierungen :smile:

Cheatah

P.S.: Rule based optimizer, hoffe ich doch?

Himmel, ich liebe Optimierungen :smile:
P.S.: Rule based optimizer, hoffe ich doch?

aeh, wie darf ich das jetzt verstehen? oder meinst du nur, dass sich bei dieser daten"menge" der kostenbasierte nicht lohnt?

joachim

Hi,

P.S.: Rule based optimizer, hoffe ich doch?

aeh, wie darf ich das jetzt verstehen?

als allgemeinen Rat… nach ausgiebiger Erfahrung damit, den kostenbasierten Optimizer dazu (nicht) zu bringen, meine Statements so abzufahren, wie _ich_ es möchte, sehe ich bereits die Möglichkeit, etwas anderes als „Rule based“ einzustellen, als Schnapsidee an :smile:

oder meinst du nur,
dass sich bei dieser daten"menge" der kostenbasierte nicht
lohnt?

Naja, bei der Planerstellung wird vermutlich die Hälfte der Gesamtzeit draufgehen; aber das passiert ja (sofern Du Bindvariablen verwendest) nur ein mal. Der Grund sind einfach die - meiner Erfahrung nach - miserablen Ergebnisse.

Cheatah

als allgemeinen Rat… nach ausgiebiger Erfahrung damit, den
kostenbasierten Optimizer dazu (nicht) zu bringen, meine
Statements so abzufahren, wie _ich_ es möchte, sehe ich
bereits die Möglichkeit, etwas anderes als „Rule based“
einzustellen, als Schnapsidee an :smile:

naja, mir ist egal, ob oracle unsere anwendung so ausfuehrt, wie ich es will, oder anders, hauptsache korrekt und ein bisschen pronto bitte :smile:
das meiste habe ich sowieso nicht geschrieben…

Naja, bei der Planerstellung wird vermutlich die Hälfte der
Gesamtzeit draufgehen; aber das passiert ja (sofern Du
Bindvariablen verwendest) nur ein mal. Der Grund sind einfach
die - meiner Erfahrung nach - miserablen Ergebnisse.

wie gesagt, bei uns war es genau umgekehrt: mit rule-based optimizer (vorgabe des anwendungsherstellers) brauchte ein bestimmter report so um die 100 sec, mit cost-based optimizer und aktuellen statistiken etwas ueber eine sekunde. ich haette unsere dba umarmen koennen!

joachim

Hi,

hauptsache korrekt und ein bisschen pronto bitte :smile:

ja, und dazu muss man vernünftig optimieren können :wink: Der cost-based optimizer ist dabei meiner Erfahrung nach eher hinderlich.

wie gesagt, bei uns war es genau umgekehrt: mit rule-based
optimizer (vorgabe des anwendungsherstellers) brauchte ein
bestimmter report so um die 100 sec, mit cost-based optimizer
und aktuellen statistiken etwas ueber eine sekunde.

Mit vernünftiger Optimierung und rule-based wird’s dann „unmessbar kurz“[tm] :wink:

Klar, wenn man sich selbst nicht um die Optimierung kümmern kann oder will, ist cost-based schon von Vorteil. Dummerweise kann die Datenbank trotz allem nicht denken. Wenn ein Experte sich das Statement richtig zusammenschachtelt und vernünftige Hints vergibt - von den richtigen Indizes ganz zu schweigen - kann Oracle aber keine Spur dagegenanstinken. Oracle ist eben kein Miracle, Human Intelligence aber schon :smile:

Cheatah

hauptsache korrekt und ein bisschen pronto bitte :smile:

ja, und dazu muss man vernünftig optimieren können :wink: Der
cost-based optimizer ist dabei meiner Erfahrung nach eher
hinderlich.

wie schon gesagt, alte fremde applikation, hunderte tabellen und ca. 100 procedures, meist laenglich =
keine lust das von hand zu optimieren!

Klar, wenn man sich selbst nicht um die Optimierung kümmern
kann oder will, ist cost-based schon von Vorteil.

siehe oben.

Dummerweise
kann die Datenbank trotz allem nicht denken. Wenn ein Experte
sich das Statement richtig zusammenschachtelt und vernünftige
Hints vergibt - von den richtigen Indizes ganz zu schweigen -
kann Oracle aber keine Spur dagegenanstinken. Oracle ist eben
kein Miracle, Human Intelligence aber schon :smile:

nun, wenn es trotzdem noch probleme gibt, kann man da immer noch hints geben (werden auch bei cost based beruecksichtigt, scheint mir). an den statements selber drehe ich nach moeglichkeit lieber nicht rum, sonst ist das letzte bisschen support auch noch floeten. das hoechste der gefuehle sind recht konkrete „verbesserungsvorschlaege“ an den hersteller zum absegnen…

joachim