SQL优化IF EXISTS

时间:2014-12-19 12:12:07

标签: sql sql-server optimization

我正在尝试优化以下内容:

IF EXISTS (
    SELECT *
    FROM #SearchResults sr
    WHERE 
        sr.src_data_col1 = @SearchCriteria OR
        sr.src_data_col2 = @SearchCriteria OR
        sr.src_data_col3 = @SearchCriteria
    )
    BEGIN

        SELECT *
        FROM #SearchResults sr
        WHERE 
            sr.src_data_col1 = @SearchCriteria OR
            sr.src_data_col2 = @SearchCriteria OR
            sr.src_data_col3 = @SearchCriteria
    END
ELSE
    BEGIN
        SELECT *
        FROM #SearchResults
    END

正在做两个SELECT语句会让它变慢吗?或者我不明白EXISTS如何正常工作?

提前致谢。

2 个答案:

答案 0 :(得分:4)

如果您担心性能问题,可以将数据保存到另一个临时表中:

SELECT *
INTO #SearchResults_2
FROM #SearchResults sr
WHERE sr.src_data_col1 = @SearchCriteria OR
      sr.src_data_col2 = @SearchCriteria OR
      sr.src_data_col3 = @SearchCriteria;

IF EXISTS (SELECT 1 FROM #SearchResults_2)
BEGIN
    SELECT *
    FROM #SearchResults_2;
END
ELSE BEGIN
    SELECT *
    FROM #SearchResults;
END;

在大多数情况下,这种优化是不必要的。如果搜索结果只有几十行或几百行,那么可能不值得创建另一个临时表。但是,您可以使用数据在系统上进行计时,以确定优化是否值得付出努力。

答案 1 :(得分:1)

在这里,您可以通过很短的方式获得相同的结果:

SELECT *
FROM #SearchResults sr
WHERE @SearchCriteria IN (sr.src_data_col1, sr.src_data_col2, sr.src_data_col3)
OR NOT EXISTS (SELECT NULL
        FROM #SearchResults sr
        WHERE @SearchCriteria IN (sr.src_data_col1, sr.src_data_col2, sr.src_data_col3));

如果子查询没有返回任何内容,则该条件变为true,您将获得所有结果。