Weitere Datenbanken pro SQL Server 2005-Instanz

7

Unser Unternehmen hostet derzeit etwa 400 Datenbanken pro SQL Server 2005-Instanz. 500-600 Datenbanken und wir sehen, dass sich die Leistung verschlechtert. Die Datenbankgröße reicht im Extremfall von 50 MB bis 40-60 GB, mit einem Durchschnitt von vielleicht ein paar GB.

Welche guten Metriken sind zu sammeln und wie würden wir diese dazu bringen, unseren Engpass zu bestimmen?

Ist es eine Leistungsbeschränkung von SQL Server, zu viele Datenbanken zu haben? Sind es alle zwischengespeicherten Prozedurpläne für Hunderte von gespeicherten Prozeduren für Hunderte von Datenbanken? Sind es ineffiziente Abfragen? Oder eine Kombination?

Was kann uns wahrscheinlich dabei helfen, die Anzahl der Datenbanken pro Server am meisten zu erhöhen? Alle Schemata sind identisch und die Datenbanken trennen die Daten jedes Kunden. Vielleicht alles umgestalten, damit wir mehrere Kunden in einer Datenbank zusammenfassen und nach Kunden filtern können, oder unsere Abfragen auf das Äußerste optimieren? Oder ist es nur eine SQL Server-Einschränkung?

TrevDev
quelle

Antworten:

9

Es wird eine Herausforderung sein, eine einheitliche Politik für ein so vielfältiges Anwesen anzuwenden. Meine erste Anlaufstelle wäre es, die größten Verbraucher von Schlüsselressourcen (CPU, Speicher, E / A) auf jeder Instanz zu verstehen, um die problematischen Datenbanken von den anderen zu isolieren. Glenn Berrys Healthcheck DMVs wären ein guter Ausgangspunkt.

Wer verwendet den größten Teil des Speichers (Pufferpools) auf jeder Instanz?

SELECT DB_NAME(database_id) AS [Database Name],
COUNT(*) * 8/1024.0 AS [Cached Size (MB)]
FROM sys.dm_os_buffer_descriptors
WHERE database_id > 4 -- system databases
AND database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id)
ORDER BY [Cached Size (MB)] DESC OPTION (RECOMPILE);

Wie lange bleiben Seiten im Pufferpool?

SELECT cntr_value AS [Page Life Expectancy]
FROM sys.dm_os_performance_counters
WHERE [object_name] = N'SQLServer:Buffer Manager'
AND counter_name = N'Page life expectancy' OPTION (RECOMPILE);

Wer generiert die meisten E / A?

SELECT DB_NAME(DB_ID()) AS [Database Name],[file_id], num_of_reads, num_of_writes, 
io_stall_read_ms, io_stall_write_ms,
CAST(100. * io_stall_read_ms/(io_stall_read_ms + io_stall_write_ms) AS DECIMAL(10,1)) AS [IO Stall Reads Pct],
CAST(100. * io_stall_write_ms/(io_stall_write_ms + io_stall_read_ms) AS DECIMAL(10,1)) AS [IO Stall Writes Pct],
(num_of_reads + num_of_writes) AS [Writes + Reads], num_of_bytes_read, num_of_bytes_written,
CAST(100. * num_of_reads/(num_of_reads + num_of_writes) AS DECIMAL(10,1)) AS [# Reads Pct],
CAST(100. * num_of_writes/(num_of_reads + num_of_writes) AS DECIMAL(10,1)) AS [# Write Pct],
CAST(100. * num_of_bytes_read/(num_of_bytes_read + num_of_bytes_written) AS DECIMAL(10,1)) AS [Read Bytes Pct],
CAST(100. * num_of_bytes_written/(num_of_bytes_read + num_of_bytes_written) AS DECIMAL(10,1)) AS [Written Bytes Pct]
FROM sys.dm_io_virtual_file_stats(DB_ID(), NULL) OPTION (RECOMPILE);

Welche Datenbanken verbrauchen am meisten CPU und welche Prozeduren?

SELECT 
    DB_NAME(qt.dbid) AS DatabaseName
  , SUM(qs.total_worker_time) AS [TotalWorkerTime]
FROM
    sys.dm_exec_query_stats AS qs
CROSS APPLY 
    sys.dm_exec_sql_text(qs.[sql_handle]) AS qt
WHERE
    DB_NAME(qt.dbid) IS NOT NULL
GROUP BY
    qt.dbid
ORDER BY
    SUM(qs.total_worker_time) DESC
OPTION
    (RECOMPILE) ;

SELECT TOP (1000)
    DB_NAME(qt.dbid) AS DatabaseName
  , qt.[text] AS [SP Name]
  , qs.total_worker_time AS [TotalWorkerTime]
FROM
    sys.dm_exec_query_stats AS qs
CROSS APPLY 
    sys.dm_exec_sql_text(qs.[sql_handle]) AS qt
WHERE
    DB_NAME(qt.dbid) IS NOT NULL
ORDER BY
    qs.total_worker_time DESC
OPTION
    (RECOMPILE) ;
Mark Storey-Smith
quelle
5

Fügen Sie dem Server mehr RAM hinzu, ohne etwas anderes zu tun. RAM wird zum Zwischenspeichern von Daten und Plänen verwendet. Fügen Sie also mehr hinzu, um den Druck dort zu reduzieren. Das Hinzufügen von zu viel RAM ist möglich, aber mit der Menge, die Sie haben, bezweifle ich es.

Führen Sie dann einige dmv-Abfragen aus, um die zu optimierenden Dinge zu finden:

Überprüfen Sie auch Ihre Festplatten:

  • separate Volumes für Tempdb
  • Verschieben Sie Ihre größten Datenbanken auf separate Volumina

Sind Sie virtuell oder physisch? Sie sollten physisch und dediziert für geladene Datenbankserver sein.

gbn
quelle
4

In SQL Server ist dies keine Begrenzung. Sie können problemlos über 600 Datenbanken hinausgehen, wenn genügend CPU und Festplatte vorhanden sind. Es ist wahrscheinlicher, dass einige Ineffizienzen eine Ressource zusammensetzen und sättigen.

Wie verschlechtert sich die Leistung? Langsamer Bildschirm aktualisiert? Könnte ein Flaschenhals am Webserver sein, vorausgesetzt, es handelt sich um ein Web-Frontend. Langsamere Berichterstellung? Ineffiziente Abfragen? oder vielleicht einfach zu viele Daten?

Sind die Workloads auf alle Datenbanken verteilt? Oder generieren die größeren 10x die Transaktionen? Abhängig von der Anzahl der Server möchten Sie möglicherweise die größeren Datenbanken von den kleinen isolieren.

Ich würde mit etwas Perfmon beginnen, die Länge der Festplattenwarteschlange, den Festplattenleerlauf% und die CPU% überprüfen. und stellen Sie sicher, dass Ihre Festplattenwarteschlangen nicht konstant hoch sind.

Verwalten Sie jede Datenbank, erstellen Sie Indizes neu, führen Sie regelmäßige Transaktionsprotokollsicherungen durch und aktualisieren Sie Statistiken? Wenn Sie die automatische Aktualisierung für Statistiken verwenden, kann dies in zufälligen Abständen zu Verlangsamungen führen.

SqlACID
quelle