Frage

In Oracle, wenn für Zeile Existenz Abfrage, warum Select 1 schnell als SELECT COUNT (*)?

War es hilfreich?

Lösung

Da Oracle nicht unterstützt IF EXISTS in PL / SQL, CodeByMidnight Vorschlag würde EXISTS zu verwenden normalerweise mit etwas getan wie

SELECT 1 
  INTO l_local_variable 
  FROM dual 
 WHERE EXISTS( 
    SELECT 1 
      FROM some_table 
     WHERE some_column = some_condition ); 

Oracle weiß, dass es die WHERE-Klausel VORHANDEN Verarbeitung stoppen kann, sobald eine Zeile gefunden wird, so dass es nicht über potentiell eine große Anzahl von Zeilen zählen, die die Kriterien entsprechen. Dies ist weniger ein Problem, natürlich, wenn Sie mit einem bestimmten Schlüssel, ob eine Zeile zu überprüfen, besteht, als wenn Sie eine Bedingung Beteiligung nicht indizierten Spalten Überprüfung oder eine Bedingung überprüft, die in einer großen Anzahl von Zeilen zurückgegeben führen könnten.

(Anmerkung: Ich wünsche, ich dies auf CodeByMidnight den Beitrag als Kommentar posten könnte, aber Kommentare enthalten können nicht formatierte Code).

UPDATE: Bei der Klärung der Original-Poster in ihrer Bemerkung gemacht, ist die kurze, definitive Antwort, dass ein SELECT 1 oder SELECT COUNT(1) nicht schneller als ein SELECT COUNT(*). Im Gegensatz zu dem, was auch immer Codierungsrichtlinien Sie betrachten, sind COUNT(*) der bevorzugte Weg, um alle Zeilen zu zählen. Es war ein alter Mythos, dass ein COUNT(1) schneller war. Zumindest das hat in einer beliebigen Version von Oracle in den letzten zehn Jahren freigegeben ist nicht wahr, und es ist unwahrscheinlich, dass es jemals zutraf. Es war eine weit verbreitete Meinung, jedoch. Heute Code, der eine COUNT(1) tut eher als ein COUNT(*) im Allgemeinen macht mich vermuten, dass der Autor neigt verschiedene Oracle Mythen zu glauben, weshalb ich vorschlagen würde COUNT(*) verwenden.

Andere Tipps

Es ist besser, noch zu verwenden, liegt vor, wenn das RDBMS sie oder eine gleichwertige unterstützt, da diese Zeilen Verarbeitung stoppt, sobald eine Übereinstimmung gefunden wird.

Ich würde überrascht, wenn select count (*) wurde nicht richtig optimiert, gibt es keine Notwendigkeit, in allen Spalten zu laden, wie es keine Spalte bezogene Verarbeitung sein.

Da ein Stern alle cols in die Zählung nimmt, „1“ ist ein nativer Datentyp.

In MySQL "SELECT COUNT (name_of_the_primary_key)" sollte so schnell wie SELECT 1 sein. Es ist der Index, der zählt. Eine Zählung () auf einen Index sollte recht schnell sein;)

Ich glaube nicht, dies für Oracle ist wahr. http://justoracle.blogspot.com/2006/12/count- vs-count1.html

Aber in einigen Datenbanken der Grund ist, weil ‚*‘ die Tabellen Meta-Daten zu besuchen hat. Dies neigt dazu, eine nicht benötigte Overhead hinzuzufügen. Wo, wie 1 nur eine wörtliche ist.

Alle anderen Dinge gleich sind, "select 1 from my_table" kehrt die ersten führen schneller als "select count(*) from my_table", aber wenn Sie alle Ergebnisse aus der Abfrage abgerufen werden, die count(*) wird man schneller sein, weil es viel weniger Daten verarbeitet werden ( 1 ganze Zahl ist, im Gegensatz zu 1 integer pro jede Zeile in der Tabelle).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top