Ich habe eine einfache SQL-Abfrage, wo ich Zeilen aus Some_Table nur auswählen, wenn die ID in Some_Table nicht in der anderen Ergebnismenge von IDs ist.Was ist die Big-O-Anweisung für WHERE NOT IN?
Zum Beispiel:
SELECT * FROM some_table
WHERE some_table.id NOT IN
(SELECT id FROM
.... whatever statement might be related to this table
)
Wenn das Unter Anweisung gibt eine Ergebnismenge wie
id
----
160142
160120
160093
160092
Ist das nicht in einem O (N), wobei ein "some_table.id" gegeben, Es beginnt an der Spitze der Ergebnismenge und scannt jeden Datensatz linear, bis er einen Datensatz mit dem gleichen Wert findet? Oder verhält es sich mit einem Hash (wie ein HashSet in Java) und kann es in O (1) finden?
Ändert sich dies durch die SQL-Implementierung? In meiner Anwendung verwenden wir beispielsweise PostgreSQL. Aber ich wäre nicht überrascht, wenn es in Oracle oder MS SQL Server anders sein könnte.
Ich würde hoffen, dass dies eine konstante Operation ist. Aber ich weiß es nicht und bin nur neugierig.
SQL ist deklarativ. Es sagt nichts über die Implementierung und somit nichts über die Leistung aus. Insbesondere können die meisten relationalen DBs unterschiedliche Abfragepläne für dieselbe Abfrage verwenden. Dadurch kann die Datenbank basierend auf statistischen Trends in den Daten optimiert werden. Dies bedeutet, dass dieselbe Abfrage auf demselben System möglicherweise zu unterschiedlichen Zeitpunkten unterschiedliche Pläne verwendet, da sich die Daten geändert haben. – jpmc26
Sie können den Befehl 'EXPLAIN' nützlich finden. pgAdmin zeigt den Plan grafisch an, wenn Sie die Schaltfläche "Abfrage erklären" verwenden. – jpmc26