我有一张非常大的桌子,有大量的记录。
[HugeTable](id, col1, col2, col3...)
前端应用程序上有一个页面显示基于许多过滤器的[HugeTable]数据。其中一个过滤器将给出[HugeTable]的子集,如果不为空
#HugeTable_subset(id)
如果存在此过滤器,#HugeTable_subset将有记录。我想将[HugeTable]数据缩小到仅匹配#HugeTable_subset中的记录。
所以现在,在t-sql中,我正在进行if-else类型的查询
IF (SELECT Count(*) FROM #HugeTable_subset) > 0
BEGIN
SELECT HugeTable.* FROM [HugeTable] h
JOIN #HugeTable_subset t
ON h.id = t.id
WHERE h.params = @searchParams
END
ELSE
BEGIN
SELECT * FROM [HugeTable] h
WHERE h.params = @searchParams
END
有没有办法可以将这两个选项合并为一个?
答案 0 :(得分:1)
要将两个选项合二为一,您可以使用 LEFT OUTTER JOIN 而不是 INNER JOIN 。 你可能已经知道了,是的,也许你不知道你已经以最优化的方式做到了。 sql-server ill为IF-ELSE中的每个选择创建两个子查询计划,并正确使用它们。
你可以用酸来测试它是否有任何差别,以及IF-ELSE是否真的击败LEFT JOIN选项
此外,还有两点我可以指出。
1)过滤器上的良好索引可以真正提高您的性能。
2)您可以使用分页返回一些结果,在结果返回大量记录时提高性能和用户体验
答案 1 :(得分:0)
SELECT HugeTable.* FROM [HugeTable] h
WHERE ((SELECT Count(*) FROM #HugeTable_subset) = 0) OR
h.id IN (SELECT t.id from #HugeTable_subset t))