我有一个ASP.NET网站,它拥有自己的独立数据缓存,并且数据不会长时间更改,因此它不需要使用相同的查询第二次查询SQL Server。我需要提高转到该SQL Server的首次(原始)查询的性能。一些查询处理的数据太多,可能导致SQL Server使用tempdb
。我不使用临时表变量或临时表,因此SQL Server决定tempdb
在需要时自行使用。
我的数据库大小为16Gb,服务器计算机上有32Gb的物理RAM。
我了解MS SQL Server缓存策略会尝试将数据保留在RAM中,以加快类似查询的性能(如果它们需要再次加载相同的数据)。除此之外,它将尝试使用可用的RAM代替tempdb来提高性能,而不会引起磁盘访问。
我想当需要在tempdb SQL Server中存储一些内容的查询出现并且没有足够的RAM可用时,SQL Server有2个选择:
1)卸载一些缓存的数据并使用备用的RAM代替tempdb以避免磁盘写入
2)保留缓存的数据以备将来查询,并开始使用tempdb,这会导致写入慢速磁盘。
我不知道在这种情况下SQL Server会做出什么选择,但我希望它成为选择#1,因为我只关心首次查询(原始)的性能,因为我再也不会向SQL Server发送相同的查询了。 (尽管我可能会发送类似的查询)。
在这种情况下,SQL Server缓存策略是什么?
在避免针对原始查询的tempdb和第二次查询的速度之间,如何平衡RAM的使用?
是否可以以选择#1的方式配置SQL Server?如果是,那怎么办?
我还能如何提高所有原始SQL查询的性能?
由于我不了解SQL Server缓存策略,因此我想将数据库放在RAM磁盘上。这将确保即使SQL Server始终选择#1,任何原始查询都可以高速加载未缓存的数据。这样做的风险是,如果SQL Server继续选择#2,则可能会开始使用更多具有较少可用RAM的tempdb(在我将16Gb用于RAM磁盘后仅剩下16Gb),这将减慢那些导致溢出的原始查询的速度tempdb
。
我对SQL 2008 R2的解决方案感兴趣,但是我想对于SQL 2008,SQL 2005可能是相同的,并且可能是SQL 2000。
说明:
该框上没有其他应用程序在运行,它专用于SQL Server。网站在单独的框中运行。
它是Windows Server 2008 R2 Enterprise 64位上的SQL Server 2008 R2 Standard Edition 64位。
我只运行只读查询,并且数据库设置为只读。
假设已经有好的索引。这个问题是关于SQL Server选择#1与选择#2,如何实现,是否有控制方法以及RAM Disk是否可以帮助它为原始查询做出正确选择的问题。