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

Rya*_*yan 92 t-sql sql-server optimization

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

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

Qua*_*noi 112

来自MSDN:

PAGEIOLATCH_SH

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

在实践中,这几乎总是发生在大桌子上的大扫描.在有效使用索引的查询中几乎不会发生这种情况.

如果您的查询是这样的:

Select * from <table> where <col1> = <value> order by <PrimaryKey>
Run Code Online (Sandbox Code Playgroud)

,检查您是否有复合索引(col1, col_primary_key).

如果你没有,那么你需要一个完整的,INDEX SCAN如果PRIMARY KEY选择了,或者SORT如果选择了一个索引col1.

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

  • 另一个可以拥有此命令的SQL命令是索引重建. (3认同)
  • @GregB:如果您已经具备 SQL 的基本知识,您可以阅读 Joe Celko 的书(所有这些书,尤其是《SQL for Smarties》和《Thinking in Sets》),当然还有我的博客:) (2认同)
  • 这确实表明我们的磁盘子系统出错.RAID磁盘在未触发监控系统的情况下发生故障.检查事件日志发现SMART确实标记了驱动器坏了. (2认同)

小智 6

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等待类型一文中找到有关此主题的更多详细信息