Sql 选择最佳性能解决方案。。。来自工会
我有两个产品表,比如说Sql 选择最佳性能解决方案。。。来自工会,sql,sql-server,tsql,union,Sql,Sql Server,Tsql,Union,我有两个产品表,比如说current\u products和history\u products,结构非常相同,在product\u code字段中有一个键 我必须在这些表格中搜索产品列表,以便进一步处理 我找到的简单解决方案如下: SELECT u.* , u.calculated_fields , t.other_fields FROM ( SELECT * FROM current_products UNION SELECT * FROM histo
current\u products
和history\u products
,结构非常相同,在product\u code
字段中有一个键
我必须在这些表格中搜索产品列表,以便进一步处理
我找到的简单解决方案如下:
SELECT u.*
, u.calculated_fields
, t.other_fields
FROM (
SELECT * FROM current_products
UNION
SELECT * FROM historical_products
) u
JOIN other_tables t
WHERE u.product_code = 'some_prodcut_code'
- 优点:干燥
- 缺点:性能不好
IF EXISTS (select * from current_products WHERE product_code = 'some_prodcut_code')
BEGIN
SELECT u.*
, u.calculated_fields
, t.other_fields
FROM current_products u
JOIN other_tables t
WHERE u.product_code = 'some_prodcut_code'
END
ELSE IF EXISTS (select * from historical_products WHERE product_code = 'some_prodcut_code')
BEGIN
SELECT u.*
, u.calculated_fields
, t.other_fields
FROM historical_products u
JOIN other_tables t
WHERE u.product_code = 'some_prodcut_code'
END
- 优点:性能更好
- 缺点:不干
还有第三种方法吗?性能会让您丧命,因为您首先从两个表中提取所有记录,然后应用where条件。。。试着换成
FROM (
SELECT * FROM current_products
WHERE product_code = 'some_prodcut_code'
UNION
SELECT * FROM historical_products
WHERE product_code = 'some_prodcut_code'
) u
JOIN other_tables t
这样,内部查询可以针对基础products表的索引工作(假定您在第一个位置有product_代码的索引,或者您可能还希望应用其他条件)。在您的第一个查询中,将where子句与内部查询一起使用,并在联合之前过滤掉不需要的行。如果您知道没有重复的行,或者您不关心重复的行,请改用
union ALL
,这样会更快。还有,@M.Ali说了什么。在派生表中进行筛选也会有所帮助。感谢大家。我听从了阿里先生的建议,它的表现很好。阿里先生,请把你的评论变成回答。