T-sql: Wie optimiere ich das Paging?

8

Ich schrieb den folgenden Code, es funktioniert gut, aber es dauert etwa 3 Sekunden, um abzuschließen, wenn die Tabelle eine Million Datensätze enthält. Gibt es eine Möglichkeit, den folgenden Code zu optimieren?

%Vor%     
Costa 06.02.2010, 18:50
quelle

3 Antworten

14

Erstens, warum DBCC DROPCLEANBUFFERS; ? Dies ist ein Hard-Cold-Reset des Pufferpools. Wenn Sie die IO-Leistung Ihrer Festplatten nicht messen und optimieren möchten, kümmert sich niemand um die Leistung eines Cold-Caches. Dies ist nicht wie Ihr System funktioniert. Das Zwischenspeichern von Seiten im Pufferpool ist der kritischste Leistungsaspekt in Datenbanken, und Sie nehmen das heraus. Es ist wie in einem Ferrari ohne den Motor zu sehen und zu fragen, warum ist so langsam. Für Leistungsmessungen sollten Sie genau das Gegenteil tun: Führen Sie die Abfrage 4-5 Mal aus, um den Cache aufzuwärmen und messen Sie dann.

Zweitens, was ist Ihre Tabellenstruktur? Ist die Tabelle Account.Customer Tabellenclusterindexreihenfolge nach Record_id ? Wenn nicht, werden Sie nie die Leistung erhalten, die Sie wollen, egal wie Sie Ihr T-SQL ausdrücken.

Und zu guter Letzt, welches System haben Sie? Verfügt es über genügend Arbeitsspeicher, um die gesamte Datenbank im Arbeitsspeicher zwischenzuspeichern? Wenn nein, kaufe mehr RAM. Gibt es andere Prozesse, die um Speicher konkurrieren, wie IIS / Asp? Wenn ja, schmeiss sie auf ihren eigenen Server, du solltest n jemals die Datenbank auf demselben Host wie der Webserver ausführen , wenn die Leistung wichtig ist.

Für einen alternativen schnellen Paging sollten Sie Keyset-basierte Lösungen in Betracht ziehen:

%Vor%

Eine keysetgesteuerte Lösung kann direkt zur letzten Position suchen und dann scannt der Bereich die nächste / vorherige Seite unter Verwendung der Clustered-Index-Schlüsselposition. Die Paging-Logik (Status) muss sich die letzten und ersten Schlüssel auf der angezeigten Seite merken, um von dort fortfahren zu können, anstatt sich die Seitennummer zu merken.

Rowcount-basierte Lösungen (wie auch LIMIT in MySQL) sind weniger effizient als Keyset-basierte, weil sie die Datensätze immer zählen müssen, um sich selbst zu positionieren, anstatt direkt auf die Position zu suchen, wie es Keysets können.

    
Remus Rusanu 06.02.2010, 20:25
quelle
2

Ich verwende diese gespeicherte Prozedur:

%Vor%     
masoud ramezani 07.02.2010 08:13
quelle
1

Wenn jemand SQL Server 2012 verwendet - ein neues Feature wurde in der ORDER BY-Klausel hinzugefügt, um die Optimierung eines Set-Daten abzufragen, erleichtert die Arbeit mit Daten-Paging für jeden, der in T-SQL schreibt für die gesamte Ausführung Planen Sie in SQL Server. Referenz hier .

>     
rageit 06.01.2015 15:19
quelle