Wie kann ich feststellen, ob meine SQL Server DB-Leistung hardwarebeschränkt ist?


8

Testen einer App, die derzeit unter Einzelbenutzerlast steht - da die Testdaten auf Produktionsgrößen angestiegen sind (400.000 bis 2 Millionen Zeilen pro Tabelle), sind einige SELECT-SPs nicht mehr schnell genug (mit begrenzten Testdaten, die früher jeweils <30 ms waren). Jetzt sind es 100-200 ms, aber es gibt mehrere, so dass die Verzögerung in der Benutzeroberfläche sichtbar wird.


Es ist fast garantiert, Code und Design, nicht Hardware ...
gbn

Wenn Ihre Abfragen die analytischen Funktionen nutzen könnten, ist SQL Server 2000 definitiv softwaregeschränkt.
Bernd_k

Nun, es ist zumindest nicht ganz Hardware - ich habe eine Instanz von 2008 Express nebeneinander auf die Testmaschine gestellt. 2000-mal liegen immer noch im gleichen Bereich, 2008-mal sind alle <20ms. Die Wartestatistiken scheinen den Unterschied nicht zu verdeutlichen. Nach dem Löschen der Statistiken und einem identischen App-Test hatte 2000 eine PAGEIOLATCH_SH-Wartezeit von 2,48 s, eine durchschnittliche Wartezeit von 4 ms. 2008 hatte 2.14s, durchschnittlich 2ms warten. Was ist besser, erklärt aber nicht die 10-fache Verbesserung der tatsächlichen Reaktionszeiten - ist das nur bei allgemeinen Motorverbesserungen von 2000 bis 2008 der Fall, die sich nicht in Statistiken widerspiegeln?
Pastymage

Antworten:


8

Sie können verwenden DBCC SQLPERF("waitstats"). Dadurch werden die Wartezeiten der Aufgaben zurückgegeben, auf die Ihr SQL Server gewartet hat. Detaillierte Erklärungen zu den einzelnen Zählern finden Sie online. Mithilfe dieser Informationen können Sie Ihre Engpässe ermitteln.

Aktivieren Sie außerdem die Client-Statistiken im Query Analyzer, um die Wartezeiten auf der Client-Seite anzuzeigen.

Ich gehe davon aus, dass sich Ihre Hardware seit Ihrem ersten Test nicht geändert hat. Da sie also konstant sind, würde ich nicht daran zweifeln.


Ich habe ein paar Fragen beantwortet, um die relevanten Informationen aus den Wartestatistiken zu bestellen und zu filtern, und es hat mir nicht viel gesagt (siehe meinen Kommentar zum Originalartikel).
Pastymage

@Pastymage versuchen Sie auch, sp_updatestats in Ihrer SQL 2000-Datenbank auszuführen. Sie versuchen die Abfrage erneut und prüfen, ob sich die Leistung verbessert.
Stanley Johns

Nein, genau das gleiche. Das Gleiche gilt für die Verwendung von DBCC-Updates.
Pastymage

2

Gedanken:

  • Hardware ist fast nie ein Problem: Es ist schlechtes Design und Code
  • Testen Sie immer mit produktionsnahen Datenqualität und -quantität

Einige Lösungen:

Führen Sie die fehlende Index-DMV aus, um fehlende Indizes anzuzeigen:

SELECT 
  migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure, 
  'CREATE INDEX [missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle) 
  + '_' + LEFT (PARSENAME(mid.statement, 1), 32) + ']'
  + ' ON ' + mid.statement 
  + ' (' + ISNULL (mid.equality_columns,'') 
    + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END 
    + ISNULL (mid.inequality_columns, '')
  + ')' 
  + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement, 
  migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

... und teuerste DMV-Anfragen

SELECT TOP 20
    qs.sql_handle,
    qs.execution_count,
    qs.total_worker_time AS Total_CPU,
    total_CPU_inSeconds = --Converted from microseconds
    qs.total_worker_time/1000000,
    average_CPU_inSeconds = --Converted from microseconds
    (qs.total_worker_time/1000000) / qs.execution_count,
    qs.total_elapsed_time,
    total_elapsed_time_inSeconds = --Converted from microseconds
    qs.total_elapsed_time/1000000,
    st.text,
    qp.query_plan
FROM
    sys.dm_exec_query_stats AS qs
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
        CROSS apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY qs.total_worker_time DESC

Andernfalls enthält diese SO-Frage gute Tipps von mir und anderen SQL-Typen mit hohen Wiederholungszahlen: https://stackoverflow.com/q/4118156/27535 (Ich werde nicht alle 3 längeren Antworten kopieren / einfügen.)


Diese DMVs sind großartig für 2005+, funktionieren aber nicht für 2000.
SqlSandwiches

@ SQLSandwiches: Ups, habe das verpasst.
Gbn

Versucht dies in der 2008 Express-Instanz, die ich eingerichtet habe - dm_exec_query_stats scheint nicht vorhanden zu sein?
Pastymage

1

Protokollieren Sie Systemressourcen oder sehen Sie im Task-Manager nach, wie viele Systemressourcen von den Prozessen verwendet werden.


1

Interessant ist, dass die Version von MSSQL 2000 ausgeführt wird

Es gibt vier Versionen der Binärdateien

  1. ausdrücken
  2. Standard
  3. Fachmann
  4. Unternehmen

Jede dieser Versionen hat Einschränkungen in Bezug auf RAM und CPU.

Es lohnt sich, die Möglichkeit zu untersuchen, dass die derzeit gespeicherte Datenmenge aufgrund von Abfragen, die mehr RAM zur Erfüllung von Abfragen / Unterabfragen benötigen, oder einer unzureichenden CPU-Auslastung einfach über die Funktionen der Version von MSSQL 2000 hinausgewachsen ist. Möglicherweise müssen Sie die Binärversion auf die MSSQL 2000 Entrprise-Version aktualisieren (wahrscheinlich ein langer Weg, da Ihre MSSQL-Version alt ist) oder die beste Version, die sich Ihr Budget leisten kann.

Möglicherweise möchten Sie sogar MSSQL 2000 verlassen, da 2008 das neueste ist und aktuelle Unterstützung verfügbar ist. Auch dies könnte ein Budgetproblem sein. Wenn Sie Enterprise bereits verwenden oder Ihr Budget keine größeren Upgrades zulässt, können Sie jetzt DB Statistics oder DB Design erkunden.

Haftungsausschluss: Ich bin kein SQL Server-DBA


Ein Upgrade auf 2008 scheint eine schnelle Lösung zu sein, da selbst 2008 Express mit seinen 1 CPU 1 GB RAM-Limits das Problem vollständig gelöst hat. Trotzdem würde ich gerne verstehen, warum / wie ...
Pastymage
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.