Ich lese Hadoop: Die definitive Anleitung von Tom White. In Kapitel 13.6 "HBase vs RDMS" sagte er, dass, wenn Sie viele Daten haben, selbst einfache Abfragen wie 10 neue Elemente extrem teuer sind und sie mit Python und PL/SQL neu geschrieben werden mussten.Sind RDBMS so schlecht, wie in Hadoop beschrieben: Der definitive Leitfaden?
Er gibt die folgende Abfrage als Beispiel:
SELECT id, stamp, type FROM streams
WHERE type IN ('type1','type2','type3','type4',...,'typeN')
ORDER BY stamp DESC LIMIT 10 OFFSET 0;
Und sagt: „ein RDBMS Anfrageplaner behandelt diese Abfrage wie folgt:
MERGE (
SELECT id, stamp, type FROM streams
WHERE type = 'type1' ORDER BY stamp DESC,
...,
SELECT id, stamp, type FROM streams
WHERE type = 'typeK' ORDER BY stamp DESC
) ORDER BY stamp DESC LIMIT 10 OFFSET 0;
Das Problem hier ist, dass wir nach nur die oberen 10 IDs, aber die Abfrage Planer tatsächlich eine gesamte Merge materialisiert und dann begrenzt auf die Ende .... Wir gingen tatsächlich so weit wie , um ein benutzerdefiniertes PL/Python-Skript zu schreiben, das einen Heapsort ausführte. ... In fast allen Fällen übertraf diese die native SQL-Implementierung und die Strategie der Anfrageplaner ...
Erwartet perforamnce und expermiental Ergebnisse
Ich konnte den Datensatz nicht vorstellen, das wird solche probleme verursachen, dass du pl/python schreiben musst, um so einfache abfrage zu machen. Also habe ich eine Weile über dieses Problem gespielt und kam zu folgenden Beobachtungen:
Die Leistung einer solchen Abfrage wird durch O (KlogN) begrenzt. Weil es übersetzt werden kann, um so etwas wie folgt:
SELECT * FROM (
SELECT id, stamp, type FROM streams
WHERE type = 'type1' ORDER BY stamp DESC LIMIT 10,
UNION
...,
SELECT id, stamp, type FROM streams
WHERE type = 'typeK' ORDER BY stamp DESC LIMIT 10
) t ORDER BY stamp DESC LIMIT 10;
(beachten Sie die ‚LIMIT 10‘ bei jeder Abfrage BTW weiß ich, dass ich nicht begrenzen und Gewerkschaften Reihenfolge kann, aber ich habe Einwickeln wählt abgezogen. aus Gründen der Lesbarkeit)
Jede Unterabfrage sollte so schnell laufen wie das Finden der richtigen Position in einem Index O (logN) und das Zurückgeben von 10 Elementen. Wenn wir das K mal wiederholen, erhalten wir O (KlogN).
Und auch wenn der Abfrageplaner so schlecht ist, dass er die erste Abfrage nicht optimieren kann, können wir ihn immer in die Abfrage mit Unionen übersetzen und die gewünschte Leistung erhalten, ohne etwas in pl/python zu schreiben.
Um meine Berechnungen zu überprüfen, habe ich die Abfragen über einem PostgreSQL mit 9.000.000 Testaufzeichnungen ausgeführt. Die Ergebnisse bestätigten meine Erwartungen, dass beide Anfragen für die erste Anfrage 100 ms und für die zweite 300 ms waren.
Wenn also die Abfrage in 100ms für 9.000.000 (logn = 23) Datensätze ausgeführt wird, dann sollte sie für 9.000.000.000 (logn = 33) Datensätze in 140ms laufen.
Fragen
- Sehen Sie irgendwelche Mängel in oben Argumentation?
- Können Sie sich einen Datensatz vorstellen, in dem Sie solche Abfragen wie oben in pl/python schreiben müssten?
- Sehen Sie eine Situation, in der eine solche Abfrage in O (K log n) nicht funktionieren würde?
Nein, sind sie nicht. Welche Datenbank fragt einmal für jedes Element in einem Filter eines Feldes eine vollständige Tabelle ab, führt alle Datensätze zusammen, ordnet sie an und führt dann die Begrenzung am Ende aus? – MkV