我正在使用 SQL Server 2012。我有一个最终会被调整的存储过程,但我有一个问题。我的服务器内存为 32 GB,在 SQL Server 中分配的最大内存为 20 GB。当我执行这个 SP 时,逻辑读取大约是 4000000,所以 8kb 的 4M 数据页时间,除以 1024,我将在内存中获得 30 GB 的数据。
我的问题是如果我只分配了 20 GB 的内存,SQL Server 如何在内存中保留 30 GB 的数据?可能我的问题看起来很傻,但需要你们的帮助。谢谢
首先,您的扫描计数为 17。即,它一遍又一遍地重新读取同一组数据,这些数据的总数为 4616999 次逻辑读取。假设完全相同的一组数据被重新读取 17 次,您可以将 30 GB 除以 17 以获得从磁盘读取的数据量。因此,首先通过它读取 1.8 GB 数据,然后它重新读取同一组数据 16 次。1.8 GB 数据装入内存没问题。
其次,即使您的扫描计数确实为 1,并且数据无法放入内存中,那么问题出在哪里?当它读取一些数据时,该数据可以在读取过程中随着读取操作的进一步进行而从内存中删除。
最后,不要被来自统计 IO 的“物理读取”所迷惑。您还可以将物理 I/O 作为预读、blob 读取等进行。确保读取整行,并且应将逻辑读取后的所有数字相加以获得总物理读取。此外,perfmon 缓冲区缓存命中率计数器不包括预读,这意味着它非常具有误导性。
| 归档时间: |
|
| 查看次数: |
1253 次 |
| 最近记录: |