在生产数据库中创建非聚集索引的影响

S N*_*ash 1 t-sql sql-server

我的网页非常慢。发现底层存储过程缺少关键索引。

创建索引后,页面速度非常快,问题就解决了。

我需要知道的是,当应用程序大量使用时,在生产数据库表中创建此索引是否会以某种方式影响用户(即使在很短的时间内)

索引是非聚集的,表有数百万行。

这个应用程序每天 24 小时都在使用。

我们公司使用的是企业版。

详细信息: Microsoft SQL Server 2019 (RTM-CU20) (KB5024276) - 15.0.4312.2 (X64) 2023 年 4 月 1 日 12:10:46 版权所有 (C) 2019 Microsoft Corporation 企业版:基于内核的许可(64 位) Windows Server 2019 Standard 10.0(内部版本 17763:)(管理程序)

对于未来的读者:我们将索引部署到一个包含 3700 万行的表。影响几乎没有,没有用户报告任何速度缓慢。

我们自己的测试也表明更新或插入没有缓慢。

不过我还必须说这张桌子在白天的使用率并不高。使用情况一般。因此,如果您有超级活跃的表,请谨慎行事。

Mar*_*ith 5

创建非聚集索引的脱机索引操作会获取表上的共享 (S) 锁。这可以防止更新基础表,但允许读取操作,例如 SELECT 语句。来源

因此,这比Sch-M锁的阻塞要少,但您仍然希望实际停止发送写入请求的任何进程,以避免在其请求与锁不兼容的锁之后开发阻塞链S,因此无论如何都可能阻塞读取器(如果您使用RCSI 供读者参考)。

为了避免使表在持续时间内只读,您需要指定

WITH (ONLINE = ON);
Run Code Online (Sandbox Code Playgroud)

但以上需要企业版。

然而仍然存在一个问题,即使如此,仍然需要共享锁(每次间隔很短两次)

在此输入图像描述

图片来源-在线索引操作白皮书

即使它只S在等待共享锁的短时间内需要该锁,也可能会形成阻塞链。

如果您使用的是 SQL Server 2022+,您可以指定一个WAIT_AT_LOW_PRIORITY选项来允许其他查询在它前面插队,并希望它能够在该时间段内无竞争地获得锁 - 并指定如果可以的话应该发生什么到时候就拿不到锁了。

WITH (ONLINE = ON 
        (WAIT_AT_LOW_PRIORITY 
           (MAX_DURATION = 30 MINUTES, ABORT_AFTER_WAIT = NONE)
        )
     );
Run Code Online (Sandbox Code Playgroud)

超时后...

  • ABORT_AFTER_WAIT = SELF- 只是放弃操作。
  • ABORT_AFTER_WAIT = NONE- 以正常优先级等待锁定,因此可能会像以前一样导致阻塞。
  • ABORT_AFTER_WAIT = BLOCKERS- 终止所有阻止在线索引重建 DDL 操作的用户事务,以便该操作可以继续。

如果您不是使用 SQL Server 2022+,则无法获得此选项,因此您必须接受您可能会在这些点上看到一些阻塞。

您还可以考虑指定MAXDOP限制并行度并确保它不会占用所有调度程序。