【发布时间】:2013-10-28 14:11:26
【问题描述】:
约束
我目前无法更改查询,因为它是由应用程序动态构建的,我们无法在今天、本周甚至本月将代码推送到 PROD 并进行修复。这必须在数据库中解决。这就是我评估索引的原因。
我们的数据库中有一个表 CaseHistory,它有大约 10MM 行。不可怕,但这是一种成长的痛苦。读取时间开始受到来自如下搜索的查询的影响:
select CaseNumber
,isnull(
(
select convert(varchar,min(CreationTimeGMT),101)
from CaseHistory
where CaseNumber = c.CaseNumber
and ActionTypeID = 1
), 'N/A'
) as CreationTimeGMT
...
from [Case] c
where CaseNumber in (
select CaseNumber from CaseHistory
where ActionTypeID <> 1 and
CreationTimeGMT >= '10/25/2013'
) AND
CaseNumber in (
select CaseNumber from CaseHistory
where ActionTypeID <> 1 and
CreationTimeGMT <= '10/25/2013'
)
现在,乍一看可能会认为获取CreateionTimeGMT 的子查询可能是个问题,但我不这么认为,因为我已经分析了执行计划。此查询的执行计划针对IX_CaseHistory_1 使用了SEEK 上99% 的处理(在当前索引 中显示)。为了进一步具体化我不认为是子查询的原因,直接搜索CaseNumber,如下所示:
select CaseNumber
,isnull(
(
select convert(varchar,min(CreationTimeGMT),101)
from CaseHistory
where CaseNumber = c.CaseNumber
and ActionTypeID = 1
), 'N/A'
) as CreationTimeGMT
...
from [Case] c
where CaseNumber = '123456'
是 sub 1s,而上述查询在 13s 和 15s 之间运行。
当前索引
IX_CaseHistory (CaseNumber (ASC))
IX_CaseHistory_1 (ActionTypeID (ASC))
IX_CaseHistory_2 (CreationTimeGMT (ASC))
所以,我想做的是在CaseNumber, ActionTypeID, CreationTimeGMT 上构建一个集群 覆盖索引。目前聚集索引位于IDENTITY PK。
为什么要集群?
因为我也希望这个查询运行得更快(每天执行 1000 次):
select CaseHistoryID
,CaseNumber
,ActionTypeID
,CreationTimeGMT
,UserID
,Notes
from CaseHistory
where CaseNumber = @CaseNumber
order by CreationTimeGMT
但是,我有一个基本问题,我如何预测这会对写入时间产生什么样的影响?
【问题讨论】:
-
+1 提出一个简洁的问题
-
能否添加相关的数据库标签?
-
我们需要查看查询计划来评估您的分析。
-
也许将您的两个 IN 更改为一个查询可能会使事情变得更快:从 CaseHistory 中选择 CaseNumber 其中 ActionTypeID 1 group by CaseNumber 具有 min(CreationTimeGMT) '10/25/2013'
-
@the_lotus,是的,这是保证。我添加了一个事实,即我不能将查询更改为约束。
标签: sql sql-server performance sql-server-2008-r2