我正在尝试优化以下内容:
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
如何正常工作?
提前致谢。
答案 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
,您将获得所有结果。