2012-03-27 6 views
0

Ich habe die folgenden zwei Abfragen, ich glaube, dass derjenige, der die drei Index-Scans (zweiter) statt einer vollen verwendet, effizienter ist, aber ich brauche ein paar mehr Meinungen. Wie kann ich aus den drei Zählwerten in der zweiten Abfrage eine Anzahl erhalten? Wie kann ich sie zu einem kombinieren?Welche Abfrage der beiden ist effizienter?

erste Abfrage

SELECT count(*) FROM bldng 
WHERE (bldng_type LIKE '%PTR%' OR bldng_type LIKE '%FACILITY-A%' 
OR bldng_type LIKE '%FACILITY-B%') AND area_sqf > 500 

zweite Abfrage

SELECT count(*) FROM bldng WHERE bldng_type LIKE '%PTR%' AND area_sqf > 500 
UNION ALL 
SELECT count(*) FROM bldng WHERE bldng_type LIKE '%FACILITY-A%' AND area_sqf > 500 
UNION ALL 
SELECT count(*) FROM bldng WHERE bldng_type LIKE '%FACILITY-B%' AND area_sqf > 500 

Ok das ist das Ergebnis kam ich mit, nachdem ich beiden Abfragen lief mit 'set statistics io auf'

First (Single Zeile) Abfrage:

Category Timestamp Duration Message Line Position 
Connection 3/27/2012 2:36:49 PM  3615: Table 'bldng'. Scan count 1, logical reads 33320, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 1 0 

Zweite Abfrage:

Category Timestamp Duration Message Line Position 
Connection 3/27/2012 2:38:15 PM  3615: Table 'bldng'. Scan count 15, logical reads 76703, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 1 0 

Category Timestamp Duration Message Line Position 
Connection 3/27/2012 2:38:15 PM  3615: Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 1 0 

Ich bin nicht sicher, wie diese allerdings zu interpretieren. Vergleiche ich die logischen Lesevorgänge 33320 < 76703? Also die erste hat weniger, bedeutet es, dass es effizienter läuft?

+2

Welche DBMS verwenden Sie? Haben Sie den Ausführungsplan jeder Abfrage überprüft? –

+1

Auch diese Abfragen führen zwei verschiedene Dinge aus. Versuchen Sie, die Anzahl der Datensätze zu ermitteln, die allen Ihren Kriterien entsprechen? –

+0

Datenbank ist SQL Server 2005 – dido

Antwort

0

Das Ausführen einer Anweisung ist in der Regel effizienter als das Ausführen von drei Anweisungen und das anschließende Zusammenführen der Ergebnisse.

Ich gehe davon aus, dass Sie die Gesamtanzahl für alle von Ihnen bereitgestellten Filter haben wollen (addiert die 3 Zeilen Ihrer zweiten Abfrage zu der Summe in der ersten Abfrage).

Wenn Sie sagen "3 Indizes verwendet" - haben Sie 3 verschiedene Indizes für die Spalte bldng_type erstellt?

Ich würde mit der ersten Aussage bleiben, da es in der Regel nur einen Filter auf den Index für die Spalte bldng_type mit allen 3 Filter, ein Filter für die Spalte Area_sqf, und dann eine Zählung auf die Ergebnisse des Filters durchführen wird.

Wenn Sie die zweite ausführen, kann es versuchen, die Tabelle 3 Mal abzufragen und dann die Ergebnisse zusammenzuführen.

Aber um wirklich sicher zu sein, müssen Sie den Ausführungsplan der Abfrage anzeigen, um festzustellen, was sie tut.

+0

Nun, wenn ich beide Anweisungen ausführe, scheint es, dass die erste immer langsamer als die zweite ausgeführt wird (vergleicht die Zeit, die sie benötigt, um sie auszuführen). Ich bin nicht sicher, was Sie mit Ausführungsplan meinen? Ich schreibe gerade diese für ein neues Projekt. Es ist noch nichts wirklich entwickelt worden ... Ist die Information über die Ausführungszeit (von dem Editor, den ich verwende) zuverlässig? – dido

0

Kein SQL-Experte, aber von dem, an was ich mich erinnere, ist eine einzelne Aussage normalerweise besser, weil es dem Optimierer ermöglicht, seine Arbeit besser zu machen. Obwohl eine boolesche Kurzschlusslogik nicht garantiert ist, ist sie eine Option, die dem Optimierer in der ersten Anweisung zur Verfügung steht, während sie in der zweiten Option explizit vermieden wird. Außerdem sollten Sie die OR-Vergleiche priorisieren, indem Sie sie mit Klammern gruppieren ...

2

Zunächst einmal verwendet keine der von Ihnen geschriebenen Anweisungen einen Index für die Spalte bldng_type. LIKE Vergleiche mit dem Platzhalter am Anfang der Zeichenfolge sind nicht optimierbar.

In diesem Fall würde ich annehmen, dass die erste Abfrage effizienter ist, da es sich um einen einzelnen Tabellenscan handelt und nicht um drei separate. Aber siehe unten.

Fragen von "welche Abfrage effizienter ist" können nur beantwortet werden, indem Sie den Abfrageplan, der von der Datenbank-Engine erstellt wird, untersuchen.Der Plan hängt nicht nur von der Struktur der Abfrage ab, sondern auch von statistischen Informationen über die Spalten, mit denen Sie vergleichen, und da sich diese Statistiken ändern können, wenn Sie Daten in Ihre Datenbank einfügen und aktualisieren, kann sich der effizienteste Abfrageplan im Laufe der Zeit ändern auch.

Schließlich würde eine "perfekte" Datenbank-Engine alle semantisch identischen Abfragen auf den gleichen optimierten Abfrageplan reduzieren. Das ist in dem von Ihnen angegebenen Fall nicht möglich, da die Abfragen tatsächlich zu unterschiedlichen Ergebnissen führen. Wenn Sie die Abfragen jedoch so geschrieben haben, dass sie erkennbar identisch sind, sollten sie (wiederum in einer perfekten Datenbank-Engine) in der gleichen Zeit ausgeführt werden.

Verwandte Themen