在原始查询中或在单独的查询中使用 CASE 是否更有效?
Is it more efficient to use the CASE in the original query or in a separate query?
我无法显示真实的查询,但这是我正在做的事情类型的示例:
select
t1.contract,
t1.state,
t1.status,
t2.product,
case
when t2.product_cost > 100 and t3.status = 'Closed' then 'Success'
when t2.product_cost <= 100 and t3.status = 'Closed' then 'Semi-Success'
else 'Failure'
end as performance,
t3.sales_date
from contract_table as t1
left join product_table as t2 on t1.prodkey = t2.prodkey
left join sales_table as t3 on (t1.client_number = t3.client_number and t1.contract=t3.contract)
where t1.client_number in (1, 2, 5, 8, 10)
涉及的table目前已有2700万条记录,并且还在快速增长。
这个查询将放在一个视图中,然后用于生成各种摘要。
我的问题是这样的。将 3 个 table 连接到 1 个具有执行 case 语句所需的详细信息的视图,然后 运行 使用 case 语句创建新变量的第二个查询会更有效吗?或者我在这里做的事情更有效率?
基本上,我不知道 SQL 如何处理 select 语句并解释 where 语句从合同 table 过滤客户而不是销售 table 即使 client_number 字段在两者中。
在所有其他条件相同的情况下,我能看到的唯一会以某种方式改变效率的是外部查询中是否有 where 子句条件。如果在视图上执行的外部查询将具有限制返回记录数的 where 子句,那么将 case 语句放在上面会更有效。这样 case 操作将只在通过这些条件的记录上执行,而不是在通过视图条件的每条记录上执行,只是让外部查询丢弃这些值。
对于视图,我倾向于尽可能多地保留非常原始的数据。部分是出于这个原因,以便在决定使用哪些行后,对视图进行的任何查询只能对这些行执行必要的操作。
至于 sql 如何考虑从合同 table 而不是销售 table 过滤客户,请仔细考虑 where 子句和连接。 where 子句说只抓取合约 table 的客户是 1,2,5,8,10 的记录。但是连接条件告诉它只从销售中获取 table 的客户编号与合同 table 的客户编号相匹配的记录。如果它从合同中获取的唯一记录是 1、2、5、8、10,那么与该连接匹配的唯一记录将是客户编号也是 1、2、5、8、10 的记录。这有意义吗?
我无法显示真实的查询,但这是我正在做的事情类型的示例:
select
t1.contract,
t1.state,
t1.status,
t2.product,
case
when t2.product_cost > 100 and t3.status = 'Closed' then 'Success'
when t2.product_cost <= 100 and t3.status = 'Closed' then 'Semi-Success'
else 'Failure'
end as performance,
t3.sales_date
from contract_table as t1
left join product_table as t2 on t1.prodkey = t2.prodkey
left join sales_table as t3 on (t1.client_number = t3.client_number and t1.contract=t3.contract)
where t1.client_number in (1, 2, 5, 8, 10)
涉及的table目前已有2700万条记录,并且还在快速增长。
这个查询将放在一个视图中,然后用于生成各种摘要。
我的问题是这样的。将 3 个 table 连接到 1 个具有执行 case 语句所需的详细信息的视图,然后 运行 使用 case 语句创建新变量的第二个查询会更有效吗?或者我在这里做的事情更有效率?
基本上,我不知道 SQL 如何处理 select 语句并解释 where 语句从合同 table 过滤客户而不是销售 table 即使 client_number 字段在两者中。
在所有其他条件相同的情况下,我能看到的唯一会以某种方式改变效率的是外部查询中是否有 where 子句条件。如果在视图上执行的外部查询将具有限制返回记录数的 where 子句,那么将 case 语句放在上面会更有效。这样 case 操作将只在通过这些条件的记录上执行,而不是在通过视图条件的每条记录上执行,只是让外部查询丢弃这些值。
对于视图,我倾向于尽可能多地保留非常原始的数据。部分是出于这个原因,以便在决定使用哪些行后,对视图进行的任何查询只能对这些行执行必要的操作。
至于 sql 如何考虑从合同 table 而不是销售 table 过滤客户,请仔细考虑 where 子句和连接。 where 子句说只抓取合约 table 的客户是 1,2,5,8,10 的记录。但是连接条件告诉它只从销售中获取 table 的客户编号与合同 table 的客户编号相匹配的记录。如果它从合同中获取的唯一记录是 1、2、5、8、10,那么与该连接匹配的唯一记录将是客户编号也是 1、2、5、8、10 的记录。这有意义吗?