1. SQLServer最大内存优化性能概述
SQLServer是一个占用大量内存的软件,在运行过程中需要大量的内存空间来存储数据和执行程序,这对服务器的性能带来了很大的影响。为了保证SQLServer的性能,需要对其最大内存进行优化。最大内存的设置是SQLServer性能优化中非常关键的一部分。正确地设置最大内存能够提高SQLServer的性能和可靠性,但是不正确地设置最大内存反而可能导致SQLServer变慢,甚至崩溃。
2. 最大内存的设置
2.1. 最大内存的默认设置
SQLServer 2016和2017的默认最大内存设置如下:
SELECT name, value, value_in_use, [description]
FROM sys.configurations
WHERE name = 'max server memory (MB)'
输出结果如下:
name value value_in_use description
---------------- ------ ------------ ------------
max server memory (MB) 2147483647 2147483647 Maximum size of server memory (MB)
可以看到,最大内存的默认设置是2147483647 MB,也就是说,SQLServer的最大内存会占用所有可用内存。这对于一个单独运行SQLServer的服务器来说是完全可以接受的,但是对于一个共享资源的服务器来说,这将会极大地影响其他应用程序的运行。
2.2. 最大内存的设置建议
在一个共享资源的服务器上,建议将SQLServer的最大内存设置在物理内存的80%左右。具体来说,如果服务器有16 GB的内存,那么最大内存应设置在13 GB左右。
如果服务器只运行SQLServer,而且没有其他应用程序需要使用内存,那么可以将SQLServer的最大内存设置为物理内存的90%以上,以提高SQLServer的性能。
3. 最大内存设置的优化
3.1. 检查系统配置
在进行最大内存设置之前,应该检查系统的配置,以确保最大内存设置得当。可以使用sys.dm_os_sys_info视图来检查系统的配置,如下所示:
SELECT *
FROM sys.dm_os_sys_info
输出结果如下:
physical_memory_kb virtual_memory_kb committed_kb committed_target_kb system_cache_kb kernel_total_virtual_size_kb kernel_paged_pool_kb kernel_nonpaged_pool_kb system_critical_threads system_free_space_kb system_process_count system_processor_count system_vm_committed_kb system_vm_reserved_kb system_cache_resident_kb percent_physical_memory_in_use percent_processor_time sqlserver_start_time affinity_type_desc max_workers_count scheduler_count os_quantum_length_ms os_error_mode_desc virtual_machine_type_desc softnuma_configuration_desc os_priority_class_desc os_scheduler_in_softnuma_desc os_affinity64_desc process_physical_affinity process_affinity_mask
------------------- ----------------- ------------- ------------------- --------------- ----------------------------- ---------------------- ------------------------ ----------------------- --------------------- --------------------- ------------------------ ------------------------- ---------------------- --------------------------- ------------------------------ ------------------------ --------------------- ------------------------ --------------- -------------- --------------------- ------------------------ --------------------------- ----------------------------- ------------------------- --------------------------- ------------------ -------------------
16971256 134217727 924032 2046051 8454240 2220352 417104 12932 47 168116676 139 16 319 90 0 12 89.85233026 Nov 26 2021 9:30PM AUTO NULL 262144 15.625 NULL NULL NONE AUTO PER_NODE AUTO 0x1fffff
从该视图中,可以得到服务器的物理内存大小,以及其他一些关键参数。
3.2. 检查当前使用内存
在进行最大内存设置之前,应该检查SQLServer当前使用的内存情况。可以使用以下查询来检查SQLServer当前使用的内存情况:
SELECT
physical_memory_in_use_kb / 1024 as physical_memory_used,
locked_page_allocations_kb / 1024 as locked_page_allocations_used,
virtual_address_space_reserved_kb / 1024 as virtual_address_space_used,
virtual_address_space_committed_kb / 1024 as virtual_address_space_committed
FROM sys.dm_os_process_memory
输出结果如下:
physical_memory_used locked_page_allocations_used virtual_address_space_used virtual_address_space_committed
-------------------- ---------------------------- --------------------------- ---------------------------------
13389 1933 356033 506694
从该查询结果中,可以看到SQLServer当前使用的内存大小,以及已锁定页面分配的内存大小等信息。
3.3. 最大内存的设置步骤
进行最大内存设置的步骤如下:
检查系统配置与当前使用内存情况。
计算最大内存大小。
执行最大内存设置。
4. 计算最大内存大小
计算最大内存大小的公式如下:
max server memory (MB) = (physical_memory_in_bytes / 1024 / 1024) * 0.8
该公式将物理内存大小除以1024,然后再除以1024,得到物理内存大小的MB表示。最终结果乘以0.8,得到最大内存大小。
5. 执行最大内存设置
在进行最大内存设置之前,需要关闭数据库引擎服务。可以使用以下命令关闭数据库引擎服务:
net stop MSSQLSERVER
关闭数据库引擎服务后,可以使用以下命令来设置最大内存:
sp_configure 'max server memory (MB)', '13000'
GO
RECONFIGURE
GO
该命令将最大内存设置为13000 MB。执行完毕后,需要重新启动数据库引擎服务:
net start MSSQLSERVER
重启数据库引擎服务后,最大内存设置就生效了。
6. 总结
SQLServer的最大内存设置对SQLServer的性能和可靠性有着非常重要的影响。在进行最大内存设置之前,需要检查系统的配置和当前使用内存情况,计算最大内存大小,然后执行最大内存设置。设置最大内存大小的公式是:(physical_memory_in_bytes / 1024 / 1024) * 0.8。