【发布时间】:2016-07-28 06:51:53
【问题描述】:
我有一个包含 exists 子句的 sql 查询。以前在两个表之间存在内部联接,但由于一些新条件,我用存在子句替换了内部联接。以下是我的查询-
SELECT id,
Count(id) AS 'ItemCount'
FROM table1 t1
WHERE ( EXISTS(SELECT DISTINCT messageid
FROM table2 t2
WHERE t2.messageid = t1.chatmessageid
AND t2.receiverid = 'xyzo-1234'
AND t2.groupid = 'wxfx-1234'
AND ( t1.userid = 'ttew-3457'
OR t1.userid IS NULL ))
OR ( t1.userid = 'ttew-3457' ) )
AND ( t1.machineid != 'C34F-A609' )
AND ( t1.createdtime > '2016-07-20 :: 07:21:51.9118534' )
AND ( t1.createdtime <= '2016-07-27 :: 13:25:30.1016155' )
AND ( t1.groupid = 'wxfx-1234' )
GROUP BY t1.id
ORDER BY t1.id
但是这个查询比上一个查询花费了更多的时间,我想进一步优化它。谁能建议我如何进一步优化此查询?
【问题讨论】:
-
好吧,对于初学者来说,
DISTINCT在EXISTS中毫无意义,因为它只关心 0 行和多于 0 行之间的区别。 -
EXISTS(...OR t1.UserId IS NULL- 你确定吗? -
如果你有可以有 NULL 值的列,用类似
isnull(t1.UserId, '')的东西重写 -
我建议您开始使用
DATETIME2数据类型来存储日期+时间信息。这将使比较/查找更快。
标签: sql-server optimization inner-join exists