任何人都可以优化这个SQL语句?

时间:2011-12-05 14:14:01

标签: sql sql-server query-optimization

数据库服务器是Microsoft SQL Server,但我没有管理员访问权限。 所以,我不知道哪个版本,我也不知道哪些索引存在。

要访问数据库,我使用的是ADO。

这是SQL语句:

-- Get master objid and order_number and activity time
SELECT A.objid,
       A.order_number,
       F.entry_time
-- From these tables
FROM   dbo.table_master as A,
       dbo.table_activity as F
-- link of the tables
WHERE  F.objid = A.objid
       -- Retrieve code = 1900 only
       AND F.code = 1900
       -- Which have info like this:
       AND F.info LIKE '%to SUPPORT.'
       -- And entry time between these times:
       AND F.entry_time >= '2011-10-01 00:00:00'
       AND F.entry_time <= '2011-12-05 23:59:59'
-- We want the earliest entry (because there might be multiple code = 900 and info like)
ORDER  by F.entry_time  

是否可以对此进行优化?

由于

3 个答案:

答案 0 :(得分:2)

以下是您可以做的不同的事情:

  • 使用RIGHT(f.info, 11) = 'to SUPPORT.'代替F.info LIKE '%to SUPPORT.'
  • 使用INNER JOIN作为@xQbert建议
  • 使用BETWEEN作为日期范围,而不是<>的组合。

在我的测试中,唯一能够改善性能的是第一种选择。所有3个项目都将生成相同的执行计划,但是,RIGHT函数在我的测试中实际执行时间快了大约10倍。我正在使用STATISTICS TIME进行测试。

如果可能,我会尝试访问以查看索引。将表格正确编入索引将比RIGHT函数产生更大的差异。

答案 1 :(得分:1)

据我所知,查询中最糟糕的部分以及无法轻松优化的部分是

AND F.info LIKE '%to SUPPORT.'

因为索引仅用于从字符串的开头匹配,而不是从末尾开始匹配。

所以如果你想要更好的性能,你可能需要找到一些方法来解决这个问题。

(哦。刚刚意识到它不是MySQL。这个答案对于mysql来说是100%正确的,但我希望它对于大多数常见的数据库引擎都是正确的)

答案 2 :(得分:0)

这是写同一件事的另一种方式;它可能会产生更快的性能 由于连接的性质和之间的使用。它还对连接标准施加了限制,强制在%之前进行评估,以便在评估%to SUPPORT时使用较小的子集。

SELECT A.objid, A.order_number, F.entry_time 
FROM dbo.table_master as A
INNER JOIN dbo.table_activity as F 
  ON F.objid = A.objid
  AND F.code = 1900
  AND F.entry_time BETWEEN '2011-10-01 00:00:00' AND '2011-12-05 23:59:59'
WHERE 
F.info LIKE '%to SUPPORT.'
ORDER by F.entry_time

在第一次评论后编辑。