SQL Server选择低效的执行计划

时间:2017-07-27 10:23:45

标签: indexing sql-server-2012

我有一个专门用于报告借记卡/信用卡交易的复制SQL Server。

此服务器是OLTP DB的订户。这有一个事务表,几乎每秒都会从prod OLTP中发生的新事务记录中填充。

现在,我对我的复制事务表运行以下查询,结果集有13,00,000条记录,查询需要45分钟才能执行。

SELECT 
    col1, col2, col3...., col25
FROM 
    [dbo].TRANSACTION_MAIN WITH (NOLOCK) 
WHERE   
    XACTIONDATE BETWEEN ('2017-06-01 00:00:00.000') AND ('2017-06-30 11:59:59.997') 
    AND CLIENTID IN (999) 
    AND RETURNCODE = 32 
    AND SUCCESSCODE > '99' 
    AND STATUSID = 999 
    AND XACTIONTYPEID IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) 

我有另一个环境。这是PROD OLTP的EOD备份。如果我在那里运行相同的查询,它只需2分钟即可获得相同数量的数据。

索引:该表在XACTIONDATE上具有非唯一的非聚簇索引。聚集索引位于表的标识列上。

当我检查EOD Bkp DB上的执行计划时,我看到它正在使用此索引,并且正在进行索引搜索(查看聚簇索引)以提取数据。

当我检查实时复制数据库上的执行计划时,我发现它没有进行索引搜索,而是进行索引扫描。这里没有关键的查找。

然后我在实时复制DB的SQL查询中使用查询提示FORCESEEK我在2分钟内得到结果。

所以早些时候只需要45分钟,因为SQL Server正在使用低效的执行计划。

为什么SQL Server在执行计划中没有使用正确的索引,可能的原因是什么?

谢谢, Roopesh

0 个答案:

没有答案