Ermitteln Sie alle Spalten in einer Oracle-Tabelle, die in jeder Zeile den gleichen Wert haben

8

Jeden Tag werden die Anfragen seltsamer und seltsamer.

Ich wurde gebeten, eine Abfrage zusammenzustellen, um festzustellen, welche Spalten in einer Tabelle für alle Zeilen denselben Wert enthalten. Ich sagte: "Das muss mit dem Programm gemacht werden, so dass wir es in einem Durchgang des Tisches tun können, statt mit N Pässen."

Ich wurde überstimmt.

So lange Geschichte kurz. Ich habe diese sehr einfache Abfrage, die das Problem zeigt. Es macht 4 Durchgänge über das Testset. Ich bin auf der Suche nach Ideen für SQL Magery, bei denen es nicht darum geht, Indizes für jede Spalte hinzuzufügen oder ein Programm zu schreiben oder eine komplette menschliche Laufzeit zu verwenden.

Und seufzen Es muss in der Lage sein, an jedem Tisch zu arbeiten.

Vielen Dank im Voraus für Ihre Vorschläge.

%Vor%     
EvilTeach 31.10.2013, 16:16
quelle

4 Antworten

10

meinst du sowas?

%Vor%

Bearbeiten das funktioniert:

%Vor%

Bonus: Ich habe auch die Überprüfung für die Null-Werte hinzugefügt, so ist das Ergebnis jetzt: A und D

Und die SQLFiddle-Demo für Sie.

    
mucio 31.10.2013, 16:32
quelle
8

Optimizer-Statistiken können einfach Spalten mit mehr als einem eindeutigen Wert identifizieren. Nachdem die Statistiken gesammelt wurden, gibt eine einfache Abfrage des Datenwörterbuchs die Ergebnisse fast sofort zurück.

Die Ergebnisse werden nur auf 10g genau sein, wenn Sie ESTIMATE_PERCENT = 100 verwenden. Die Ergebnisse werden auf 11g + korrekt sein, wenn Sie ESTIMATE_PERCENT = 100 oder AUTO_SAMPLE_SIZE verwenden.

Code

%Vor%

Leistung

Bei 11g könnte diese Methode ungefähr so ​​schnell sein wie die SQL-Anweisung von mucio. Optionen wie cascade => false würden die Leistung verbessern, indem Indizes nicht analysiert werden.

Aber das Schöne an dieser Methode ist, dass sie auch nützliche Statistiken liefert. Wenn das System in regelmäßigen Abständen bereits Statistiken erstellt, kann die Arbeit bereits erledigt sein.

Details zum AUTO_SAMPLE_SIZE-Algorithmus

AUTO_SAMPLE_SIZE wurde in 11g komplett geändert. Es wird kein Stichprobenverfahren zur Schätzung der Anzahl unterschiedlicher Werte (NDV) verwendet. Stattdessen durchsucht es die gesamte Tabelle und verwendet einen Hash-basierten eindeutigen Algorithmus. Dieser Algorithmus benötigt keine großen Mengen an Speicher oder temporärem Tablespace. Es ist viel schneller, den ganzen Tisch zu lesen, als nur einen kleinen Teil davon zu sortieren. Der Oracle Optimizer Blog enthält eine gute Beschreibung des Algorithmus hier . Für noch mehr Details, siehe diese Präsentation von Amit Podder. (Sie werden diese PDF-Datei scannen müssen, wenn Sie die Details in meinem nächsten Abschnitt überprüfen möchten.)

Möglichkeit eines falschen Ergebnisses

Obwohl der neue Algorithmus keinen einfachen Abtastalgorithmus verwendet, zählt er die Anzahl der verschiedenen Werte immer noch nicht zu 100% korrekt. Es ist einfach, Fälle zu finden, in denen die geschätzte Anzahl unterschiedlicher Werte nicht mit der tatsächlichen übereinstimmt. Aber wenn die Anzahl der eindeutigen Werte eindeutig ungenau ist, wie können sie in dieser Lösung vertraut werden?

Die mögliche Ungenauigkeit kommt von zwei Quellen - Hash-Kollisionen und Synopsis-Splitting. Synopsis Splitting ist die Hauptursache für Ungenauigkeiten, trifft aber hier nicht zu. Es passiert nur, wenn 13864 verschiedene Werte vorhanden sind. Und es wirft niemals alle der Werte aus, die endgültige Schätzung wird sicherlich viel größer als 1 sein.

Die einzige wirkliche Sorge ist, wie hoch die Wahrscheinlichkeit ist, dass es bei einer Hash-Kollision zwei verschiedene Werte gibt. Mit einem 64-Bit-Hash könnte die Wahrscheinlichkeit so gering wie 1 in 18,446,744,073,709,551,616 sein. Leider kenne ich die Details ihres Hashalgorithmus nicht und kenne die wahre Wahrscheinlichkeit nicht. Ich konnte keine Kollisionen durch einfache Tests und frühere Tests in der Praxis erzeugen. (Einer meiner Tests bestand darin, große Werte zu verwenden, da einige Statistikoperationen nur die ersten N Byte der Daten verwenden.)

Bedenken Sie auch, dass dies nur passiert, wenn alle der verschiedenen Werte in der Tabelle kollidieren. Wie groß ist die Wahrscheinlichkeit, dass es eine Tabelle mit nur zwei Werten gibt, die gerade kollidieren? Wahrscheinlich viel weniger als die Chance, im Lotto zu gewinnen und gleichzeitig von einem Meteoriten getroffen zu werden.

    
Jon Heller 03.11.2013 07:23
quelle
3

Wenn Sie mit dem Ergebnis in einer einzelnen Zeile leben können, sollte nur einmal scannen;

%Vor%

Eine SQLFiddle zum Testen mit .

    
Joachim Isaksson 31.10.2013 16:47
quelle
1

Dies wird in einem einzigen Scan durchgeführt

%Vor%     
ghub24 08.11.2013 08:54
quelle

Tags und Links