每个 Sql Server 2005 实例有更多数据库

Tre*_*Dev 7 performance sql-server-2005

我们公司目前为每个 SQL Server 2005 实例托管大约 400 个数据库。500-600 个数据库,我们看到性能开始下降。数据库大小在极端情况下从 50mb 到 40-60gb 不等,平均可能只有几 GB。

有哪些好的指标需要收集,我们如何获取这些指标来确定我们的瓶颈?

SQL Server 数据库太多是不是性能限制?是数百个数据库的数百个存储过程的所有缓存过程计划吗?查询效率低吗?还是组合?

什么最有可能帮助我们增加每台服务器的数据库数量?所有模式都是相同的,并且数据库将每个客户的数据分开。也许重构一切以便我们可以将多个客户合并到一个数据库中并按客户过滤,或者将我们的查询优化到极致?或者它可能只是 SQL Server 的限制?

Mar*_*ith 9

在如此多样化的产业中应用统一的政策将是一个挑战。我的第一个目标是了解每个实例上关键资源(CPU、内存、IO)的最大消费者,以期将有问题的数据库与其他数据库隔离开来。Glenn Berrys 的健康检查 DMV将是一个很好的起点。

谁在每个实例上使用大部分内存(缓冲池)?

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);
Run Code Online (Sandbox Code Playgroud)

页面在缓冲池中停留多长时间?

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);
Run Code Online (Sandbox Code Playgroud)

谁产生的 IO 最多?

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);
Run Code Online (Sandbox Code Playgroud)

哪些数据库消耗的 CPU 最多,哪些特定过程?

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) ;
Run Code Online (Sandbox Code Playgroud)


gbn*_*gbn 5

不做任何其他事情,在服务器中添加更多 RAM。RAM 用于缓存数据和计划。所以添加更多以减少那里的压力。添加过多的 RAM 是可能的,但是对于您所拥有的数量,我对此表示怀疑。

然后,运行一些 dmv 查询以查找要调整的内容:

还要检查您的磁盘:

  • tempdb 的单独卷
  • 将最大的数据库移动到单独的卷上

最后,你是虚拟的还是实体的?您应该是物理的并且专用于加载的数据库服务器。