使用 union all 分支 SQL 查询 - 性能

Posted

技术标签:

【中文标题】使用 union all 分支 SQL 查询 - 性能【英文标题】:Branching SQL query with union all - performance 【发布时间】:2014-09-08 10:28:11 【问题描述】:

我有一个视图,它返回客户和供应商的项目列表。

CREATE OR REPLACE VIEW projects_list AS
SELECT pr.*, 
       c.customer_name as party_name, 
       null as vendor_id, 
       null as vendor_data
  FROM projects pr 
  JOIN customers c on (pr.customer_id = c.customer_id)
UNION ALL 
SELECT pr.*, 
       v.vendor_name as party_name, 
       v.vendor_id, 
       v.some_column as vendor_data
  FROM projects pr 
  JOIN projects_of_vendors pov on (pr.project_id = pov.project_id) 
  JOIN vendors v on (pov.vendor_id = v.vendor_id)

基本上,我使用此视图来获取客户或供应商的项目列表,而不是同时获取两者。 因此,视图被查询为:

SELECT * FROM projects_list 
 WHERE customer_id = 'A_CUSTOMER' and vendor_id IS NULL;

SELECT * FROM projects_list 
 WHERE vendor_id = 'A_VENDOR';

所以基本上我想执行联合的第一部分,如果没有设置 vendor_id,或者第二部分 - 如果设置了 vendor_id。

问题是当我作为客户访问视图时,oracle在不必要的时候检查“vendor brack”会花费很长时间,并且查询很慢。

我现在可以将此视图一分为二,每次都选择不同的视图。但实际上我有很多依赖于这个的观点,我不直接访问这个。我将不得不复制每个“子”视图并在应用程序代码中进行许多更改以进行此更改。

有没有办法“提示”oracle 跳过联合的第一个或第二个分支?

【问题讨论】:

您可能希望考虑明确命名您的选择列。完成此操作后,尝试为每个联合添加一个额外的常量列,即“V”和“C”,然后显式选择它 - 这有帮助吗? 好像可以,谢谢 我会粘贴为答案 【参考方案1】:

您可能希望考虑明确命名您的选择列。完成此操作后,尝试为每个联合添加一个额外的常量列,即“V”和“C”,然后明确选择它 - 这有帮助吗?

CREATE OR REPLACE VIEW projects_list AS
SELECT pr.*, 'C' Type
       c.customer_name as party_name, 
       null as vendor_id, 
       null as vendor_data
  FROM projects pr 
  JOIN customers c on (pr.customer_id = c.customer_id)
UNION ALL 
SELECT pr.*, 'V'
       v.vendor_name as party_name, 
       v.vendor_id, 
       v.some_column as vendor_data
  FROM projects pr 
  JOIN projects_of_vendors pov on (pr.project_id = pov.project_id) 
  JOIN vendors v on (pov.vendor_id = v.vendor_id)

然后使用

SELECT * FROM projects_list WHERE Type = 'V'...

【讨论】:

以上是关于使用 union all 分支 SQL 查询 - 性能的主要内容,如果未能解决你的问题,请参考以下文章

sql中Union和union all的使用

SQL UNION 和 UNION ALL 操作符

SQL中Union与Union All的区别

使用 Union All 优化 SQL 查询

使用 UNION ALL SQL 查询获取更多值

SQL Server-聚焦UNIOL ALL/UNION查询