Gewusst wie: abrufen der gesamten Zeilenanzahl einer Abfrage mit TOP
Ich habe einen SQL Server 2008 query
SELECT TOP 10 *
FROM T
WHERE ...
ORDER BY ...
Ich würde gerne auch die Gesamtzahl der Zeilen. Die obious Weg ist, um eine zweite Abfrage
SELECT COUNT(*)
FROM T
WHERE ...
ORDER BY ...
Gibt es eine effiziente Methode?
Dank
InformationsquelleAutor | 2009-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wollen Sie eine zweite Abfrage?
ODER
Oder (Edit: MIT)
Beispiele 1 und 3 sind einzelne Abfragen und funktionell identisch.
Ok, ich meine ich würde gerne vermeiden, ein zweites "table scan". Ich möchte den Motor machen zu scan nur einmal die Tabelle, um die Gesamtanzahl und die n Zeilen.
Das können Sie nicht. Sie sind 2 verschiedene query-Konstrukte. Die ZÄHLUNG wird eigentlich ziemlich effizient, wahrscheinlich mehr als die Haupt-Abfrage, da es die meisten effizient
InformationsquelleAutor gbn
Was ist in dieser Antwort scheint zu funktionieren:
https://stackoverflow.com/a/19125458/16241
Im Grunde haben Sie ein:
TotalCount wird die Gesamtzahl der Zeilen. Es ist aufgelistet, in jeder Zeile obwohl.
Wenn ich getestet, diese die Abfrage-plan zeigte die Tabelle nur traf einmal.
InformationsquelleAutor Vaccano
Entfernen Sie die ORDER BY-Klausel aus der 2. Abfrage auch.
InformationsquelleAutor Joel Coehoorn
Nicht.
SQL Server
nicht haltenCOUNT(*)
im Metadaten wieMyISAM
, berechnet es zu jeder Zeit.UPDATE: Wenn Sie brauchen einen Kostenvoranschlag, Sie können die Statistiken verwenden, die Metadaten:
wo
@primary_key
ist deine Tabelle den Primärschlüssel name.Diese zurück
COUNT(*)
aus dem letzten Statistik-update.OH, ich habe gerade meine Frage selbst beantwortet...SQL_CALC_FOUND_ROWS und FOUND_ROWS() macht die Arbeit..danke!
InformationsquelleAutor Quassnoi
Ich habe noch nicht profiliert, aber ich denke, das wäre in der Tat langsamer, da es in einer sub-query und kehrte in jeder Zeile. Ich bin kein guru, obwohl, könnte der server sein, klug genug, um zu cache. Sogar noch, ich glaube nicht, es wäre schneller als zwei Abfragen, da läuft er noch Sie beide.
InformationsquelleAutor Learning