sql-server - 当 where 子句中使用的索引列具有特定值时,Azure sql 查询速度很慢

标签 sql-server azure azure-sql-database

实例:Azure SQL S2 实例 我们有一个候选人表,其中约有 170 万条记录。候选人表根据非主键 AccountID 建立索引。 AccountID:646 有 80K 行,AccountID:10 有 365K 行。

当我们触发时,从表中选择 top(10),其中 non_pk_indexed_col=int

Select top(10) from candidates where accountid=10

查询完成时所用时间为00:00:00

Select top(10) from candidates where accountid=646

,查询完成,耗时01:45:00

为什么相同的查询在值不同的情况下会花费这么长时间

最佳答案

很可能您会得到这两个参数非常不同的查询计划。因此,其中一个的性能明显优于另一个。一种检查方法是获取您的实际执行计划并进行检查。

您可以通过按 SSMS 中的“包括实际执行计划”按钮(“执行”按钮左侧大约七个)https://msdn.microsoft.com/en-us/library/ms189562.aspx 来实现此目的。

正如尼尔所说,传统上你会通过更新统计数据来修复糟糕的执行计划。您将希望使用全扫描进行更新,但为了获得最佳结果,您可以通过运行以下查询来做到这一点:

DECLARE @sql nvarchar(MAX);
SELECT @sql = (SELECT 'UPDATE STATISTICS [' + DB_NAME() + '].[' + rtrim(sc.name) + '].[' + rtrim(so.name) + '] WITH FULLSCAN, ALL; '
from sys.sysobjects so
join sys.schemas sc
on so.uid = sc.schema_id
where so.xtype = 'U' 
               FOR XML PATH(''), TYPE).value('.', 'nvarchar(MAX)');
PRINT @sql
EXEC (@sql)

希望对您有所帮助!

关于sql-server - 当 where 子句中使用的索引列具有特定值时,Azure sql 查询速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35934009/

相关文章:

sql - 如何在SQL中查找时间戳是上午、下午还是晚上

sql - 异步运行 SQL 查询

azure - 调整 Azure 地理复制数据库的大小

sql-server - 从静态 INSERT 语句覆盖重复行

sql - 将 SQL Server 兼容模式从 90 更改为 100 时有哪些差异和问题?

sql - 当列已经为 NOT NULL 时,无法在可为空的列上定义 PRIMARY KEY 约束

node.js - Azure Web 部署不显示网页

c# - 如何从具有当前纬度和经度的 cosmos db 查找最近的优惠券

linux - 无法使用公共(public) IP 访问 nginx 默认页面

sql-server - SQL Azure 速度很慢