/ / Gibt es eine Möglichkeit, die Gesamtzahl der Zeilen zu berechnen, die von einer dynamischen Abfrage in Common Table Expression (CTE) oder Unterabfrage zurückgegeben werden - sql, sql-server, sql-server-2008, tsql

Gibt es eine Möglichkeit, die Gesamtzahl der Zeilen zu berechnen, die von der dynamischen Abfrage in Common Table Expression (CTE) oder Unterabfrage zurückgegeben werden - SQL, SQL-Server, SQL-Server-2008, TSQL

Wir sind dabei, unsere Datenbank zu optimieren.Wir haben die meisten Speicherprozeduren, die CTE verwenden, weil sie uns gemäß unserer Tabellenstruktur eine hohe Leistung bieten. Wir haben fast dynamische Abfragen, die je nach Bedingung unterschiedliche Ergebnisse haben. Wir halten alle Daten in CTE und prüfen die Bedingung, die nicht der Fall war Problem, aber wir brauchen die Gesamtzahl der Zeilen, die von jeder Abfrage zurückgegeben werden. Bei der Berechnung dauert dies viel Zeit. Temporäre Tabelle oder Tabellenvariable sind in unserem Fall nicht geeignet, da das Einfügen von Daten viel Zeit in Anspruch nimmt. Wir haben die folgende Struktur

With t(fields) as
(select field1,field2.......
ROW_NUMBER() OVER (order by some column) as row...
from some table and lots of
inner n left joins
where some condition ),
rowTotal(RowTotal) as
(select max(row) from t)
select * from t,RowTotal
where condition for paging

Aber max (Zeile) hat viele Male gebraucht, wenn ich das entferneEs gibt Daten innerhalb von 100 ms zurück. Ich habe Coun (*), Count (SomeField) und viele andere ausprobiert, aber es hat viel Zeit in Anspruch genommen. Wie kann ich innerhalb einiger ms die Gesamtzahl der Zeilen von cte erreichen? Eine Aggregatfunktion funktioniert bei mir nicht. Gibt es eine andere Möglichkeit? Berechnen Sie die Zeilensumme wie @@ rowcount. Vielen Dank im Voraus für jede Hilfe.

Antworten:

1 für die Antwort № 1

Wenn Sie nach der Gesamtzahl der Zeilen aus der inneren Abfrage suchen, können Sie diese als Spalte zu Ihrer Auswahl hinzufügen COUNT() und PARTITION BY().

With t(fields) as
(select COUNT(*) OVER (PARTITION BY 1) AS TotalRows,
field1,field2.......
ROW_NUMBER() OVER (order by some column) as row...
from some table ...

Dies sollte Ihnen eine Zählung der gesamten Zeilen in "t" als erste Spalte von geben t

Ich weiß nicht, dass dies der schnellste Weg ist, um das gewünschte Ergebnis zu erzielen, aber es funktioniert für mich bei 000 zurückgegebenen Datensätzen und verhindert, dass zusätzliche Auswahlabfragen die Anzahl separat ermitteln.