Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择最佳性能解决方案。。。来自工会_Sql_Sql Server_Tsql_Union - Fatal编程技术网

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说了什么。在派生表中进行筛选也会有所帮助。感谢大家。我听从了阿里先生的建议,它的表现很好。阿里先生,请把你的评论变成回答。