我们有两个非常相似的查询,一个需要22秒,另一个需要6秒。两者都使用内部选择,具有完全相同的外部列和外部联接。唯一的区别是外部查询用于加入的内部选择。
单独运行时的内部查询在两种情况下都会在100毫秒或更短时间内执行,并返回EXACT SAME数据。
这两个查询作为一个整体都有很大的改进空间,但这种特殊的怪异对我们来说真的很困惑,我们只想了解原因。对我来说,似乎内部查询应该在100ms内执行一次,然后外部的东西发生。我有一种感觉,内部选择可能会多次执行。
需要6秒的查询:
SELECT {whole bunch of column names}
FROM (
SELECT projectItems.* FROM projectItems
WHERE projectItems.isActive = 1
ORDER BY projectItemsID ASC
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
) projectItems
LEFT JOIN categories
ON projectItems.fk_category = categories.categoryID
...{more joins}
查询需要22秒:
SELECT {whole bunch of column names}
FROM (
SELECT projectItems.* FROM projectItems
WHERE projectItems.isActive = 1
AND projectItemsID = 6539
) projectItems
LEFT JOIN categories
ON projectItems.fk_category = categories.categoryID
...{more joins}
答案 0 :(得分:0)
对于projectItems表中的每一行,在第二个函数中,搜索两列而不是一列。如果projectItemsID不是主键,或者它没有被索引,则解析额外的列需要更长的时间。'
如果查看表的大小和每个查询返回的行数,可以计算每个查询需要进行多少次比较。
答案 1 :(得分:0)
我相信你是正确的,正在为每个与类别保持联接的行运行内部查询。
我现在无法在其上找到合适的来源,但您可以通过执行此类操作并比较运行时间来轻松测试。在这里,我们至少可以确定内部查询只运行一次。 (对不起,如果任何语法不正确,但你会得到一般的想法):
DECLARE @innerQuery TABLE ( [all inner query columns here] )
INSERT INTO @innerQuery
SELECT projectItems.* FROM projectItems
WHERE projectItems.isActive = 1
AND projectItemsID = 6539
SELECT {whole bunch of field names}
FROM @innerQuery as IQ
LEFT JOIN categories
ON IQ.fk_category = categories.categoryID
...{more joins}