SELECT FROM内部查询减速

时间:2015-08-11 20:44:28

标签: sql sql-server

我们有两个非常相似的查询,一个需要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}

2 个答案:

答案 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}