yto*_*ano 6 sql-server-2008 sql-server
我运行长而复杂的查询,这些查询主要使用一个大表 - 8GB,40M 行。AFAIK,所有/大多数行都用于每个查询。我在活动监视器中看到很多 IO - 对于第一个查询和每个后续查询。服务器当前使用 6.5GB 内存,我想升级。问题是,需要多少内存才能避免所有这些磁盘读取?是在桌子大小的球场内还是更大?
这是 SET STATISTICS IO 输出。BigTable 是我要问的那个,SmallTable 与 BigTable 是一对多的关系。#entrance 保存查询的输出(数百行输出)。
Table 'SmallTable'. Scan count 249005, logical reads 2829948, physical reads 2605, read-ahead reads 10395, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'BigTable'. Scan count 194004, logical reads 13482115, physical reads 33841, read-ahead reads 1181136, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#entrance__000000000023'. Scan count 0, logical reads 1568, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Run Code Online (Sandbox Code Playgroud)
这是一个两部分的答案。
第一部分是购买尽可能多的 RAM(只要它适合服务器)。
第二部分是您将始终看到对数据的读取。诀窍是查看这些读取是物理的还是逻辑的。物理读取将下降到磁盘。逻辑读取是从内存中的缓冲池中读取的。您可以通过将“SET STATISTICS IO ON”放在 SQL 脚本的顶部然后在 SSMS 中运行它来查看这一点。在消息选项卡上,您将获得正在运行的每个查询的特定 IO 信息,特别是您将获得在一个表上发生的逻辑和物理操作(在您的情况下读取)的数量。如果物理读取数非常高(这些数字基本上是读取的块数乘以 8 然后除以 1024 得到一个以兆为单位的数字),那么您需要更多的 RAM。如果逻辑读取数字很高,那么您就不是
(注意:就本回答而言,我仅假设 SELECT 语句。INSERT/UPDATE/DELETE 操作稍微复杂一些,但适用相同的基础知识。)
您的查询的性质是什么?仅选择?还是 DUI(删除、更新、插入)的混合?您的恢复模式是什么?您使用默认的事务隔离级别吗?
如果您想将所有这些页面放入内存中,那么您将需要获得更多内存(但您已经知道了)。您想知道“多少”,但事实是,根据查询的性质,即使有足够的内存来容纳整个表,您仍然可能会看到一些 I/O 问题。
考虑以上所有内容...是的,将磁盘上表的大小作为内存量进行估算。如果您发现之后仍有磁盘 I/O,请不要感到惊讶。