删除查询的SQL查询优化

时间:2015-09-08 21:27:49

标签: sql-server optimization ssms

我正在尝试优化下面的查询,因此我将其主键

编入索引
DELETE from LSS_FPAVServiceXml 
WHERE CONVERT(datetime, LEFT(trackingid, 8)) < CAST(CONVERT(CHAR(10), GETDATE() - 90, 101) AS SMALLDATETIME)

trackingid的索引代码为:

ALTER TABLE [dbo].[LSS_FPAVServiceXml] 
    ADD CONSTRAINT [PK_LSS_FPAVRequest] 
    PRIMARY KEY CLUSTERED ([trackingid] ASC)

之后执行计划成本:73%。还有其他方法可以优化此查询吗?

请建议!

1 个答案:

答案 0 :(得分:2)

如果您是数据库的不幸所有者,其中多个值存储在单个字段中,则有三个选项。

  1. 修复设计。在单个列中存储多个值是禁忌。将值存储在单个列和适当的数据类型中。对这些列进行索引,您将获得快速的性能。
  2. 无法修复设计,因为它太昂贵/冒险?创建从原始列计算的列。对这些计算列进行索引,通常会获得快速的性能。
  3. 如果你已经达到了这一点,你可能会遇到很大麻烦。如果没有可以编制索引的列,则必须在函数中包装所有引用以获取查询的连接值/ where;这将导致表扫描和性能不佳。如果您 幸运 ,数据的格式将按照您的字母顺序排列。
  4. 在这种情况下你很幸运。根据示例数据,您应该能够这样做:

    DELETE from LSS_FPAVServiceXml 
    where trackingid LIKE CONVERT(VARCHAR,DATEADD(DAY,-90,GETDATE()),112) + '%'