SQL Server中的PAGEIOLATCH_SH等待类型是什么?


96

我有一个查询,它在事务中间需要很长时间。当我知道这个wait_type过程的时候PAGEIOLATCH_SH

此等待类型是什么意思,如何解决?

Answers:


116

Microsoft文档

PAGEIOLATCH_SH

当任务在闩锁上等待I/O请求中的缓冲区时发生。闩锁请求处于共享模式。长时间等待可能表明磁盘子系统有问题。

实际上,由于对大型表的大型扫描,几乎总是会发生这种情况。在高效使用索引的查询中几乎不会发生这种情况。

如果您的查询是这样的:

Select * from <table> where <col1> = <value> order by <PrimaryKey>

,请检查您是否有的综合索引(col1, col_primary_key)

如果您没有,则需要一个完整的(INDEX SCAN如果PRIMARY KEY选择)或一个(SORT如果col1选择一个索引)。

它们I/O在大型表上都是非常耗磁盘的操作。


这是一个真正简单的查询。从<表>中选择*,其中<col1> = <值>按<PrimaryKey>排序。我们在col1上也有一个索引,并尝试重建该索引。
瑞安

您能建议一些资源来了解什么是磁盘密集型,什么需要全索引扫描,什么需要排序等吗
Greg B

1
@GregB:如果您已经具备SQL的基本知识,则可以阅读Joe Celko的书(所有书,尤其是SQL for Smartiesand Thinking in Sets)和我的博客,当然:)
Quassnoi

3
这确实表明我们的磁盘子系统中存在错误。RAID磁盘发生故障而未触发监视系统。检查事件日志后发现SMART确实已将驱动器标记为已损坏。
Gomibushi

7

PAGEIOLATCH_SH 等待类型通常是由于索引碎片或未优化而出现的。

过多PAGEIOLATCH_SH等待类型的原因通常是:

  • I / O子系统有问题或配置错误
  • 其他产生高I / O活动的进程使I / O子系统超载
  • 不良索引管理
  • 逻辑或物理驱动器误解
  • 网络问题/延迟
  • 记忆压力
  • 同步镜像和AlwaysOn AG

为了尝试解决高PAGEIOLATCH_SH等待类型,您可以检查:

  • SQL Server,查询和索引,这通常是导致过多PAGEIOLATCH_SH等待类型的根本原因
  • 进入任何I / O子系统故障排除之前的内存压力

始终牢记,如果AlwaysOn AG中的镜像安全性很高或同步提交可用性很高,PAGEIOLATCH_SH则可能会增加/过多。

您可以在文章处理过多的SQL Server PAGEIOLATCH_SH等待类型中找到有关此主题的更多详细信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.