我的网页非常慢。发现底层存储过程缺少关键索引。
创建索引后,页面速度非常快,问题就解决了。
我需要知道的是,当应用程序大量使用时,在生产数据库表中创建此索引是否会以某种方式影响用户(即使在很短的时间内)
索引是非聚集的,表有数百万行。
这个应用程序每天 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 万行的表。影响几乎没有,没有用户报告任何速度缓慢。
我们自己的测试也表明更新或插入没有缓慢。
不过我还必须说这张桌子在白天的使用率并不高。使用情况一般。因此,如果您有超级活跃的表,请谨慎行事。
创建非聚集索引的脱机索引操作会获取表上的共享 (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限制并行度并确保它不会占用所有调度程序。
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |