约束
我目前无法更改查询,因为它是由应用程序动态构建的,我们无法在今天、本周甚至本月通过修复将代码推送到 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
可能是一个问题,但我不这么认为,因为我已经分析了执行计划。这个查询的执行计划使用了 99% 的处理SEEK
(IX_CaseHistory_1
在下面的Current Indexes中显示)。为了进一步具体化我不认为是子查询的原因,直接针对 搜索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
但是,我有一个基本问题,我如何预测这会对写入时间产生什么样的影响?