数据库服务器是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
是否可以对此进行优化?
由于
答案 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
在第一次评论后编辑。