什么是SQL Server中的PAGEIOLATCH_SH等待types?

我有一个查询,在交易中需要很长时间。 当我得到进程的wait_type时,它是PAGEIOLATCH_SH

这种等待types意味着什么?如何解决?

来自MSDN

PAGEIOLATCH_SH

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

实际上,这通常是由于在大桌子上进行大扫描而发生的。 在有效使用索引的查询中几乎不会发生。

如果你的查询是这样的:

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

,检查你在(col1, col_primary_key)上有一个复合索引。

如果您没有一个,那么如果select了PRIMARY KEY ,则需要完整的INDEX SCAN如果select了col1上的索引,则需要SORT

它们都是大型磁盘上的磁盘I/O消耗操作。

PAGEIOLATCH_SH等待types通常是由于分段或未优化的索引而产生的。

过多PAGEIOLATCH_SH等待types的原因常常是:

  • I / O子系统有问题或configuration错误
  • 其他正在生成高I / O活动的进程重载的I / O子系统
  • 糟糕的索引pipe理
  • 逻辑或物理驱动器的误解
  • networking问题/延迟
  • 内存压力
  • 同步镜像和AlwaysOn AG

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

  • SQL Server,查询和索引,因为经常可以发现这是导致过多PAGEIOLATCH_SH等待types的根本原因
  • 跳到任何I / O子系统故障排除之前的内存压力

请始终记住,在AlwaysOn AG中安全性较高的情况下镜像或同步提交可用性时,可能会增加/超出PAGEIOLATCH_SH

您可以在处理过多的SQL Server PAGEIOLATCH_SH等待types的文章中find有关此主题的更多详细信息