SELECT ... FROM UNION的最佳性能解决方案

时间:2014-03-19 16:59:15

标签: sql sql-server tsql union

我有两个产品表,让我们说current_productshistorical_products,具有相同的结构,以及product_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'
  • PROS:DRY

  • 缺点:表现不佳

性能不是最好的,所以我想创建一个这样的条件查询:

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
  • PROS:更好的表现

  • 缺点:不干嘛

问题

还有第三种方法吗?

1 个答案:

答案 0 :(得分:1)

性能会因为你首先从两个表中提取所有记录而杀死你,然后应用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

这样,内部查询可以对基础产品表的索引起作用(假设您在第一个位置的product_code上有索引,或者您可能还想要应用其他标准)。