我正在尝试在我认为两种选择之间做出选择以获得相同的数据。
我有一个表具有感兴趣的ID,以及一组4个彼此相似的表,这些表具有这些ID的数据。一旦我有每个ID的行,我将使用它们来获取最大状态字段,或最小日期字段等(在4个表中)。
我可以看到将此查询构造为1个连接到4个表的并集,或者作为4个连接的并集。哪个更有效率? FWIW,我发现第一个更容易理解,也可能更容易维护。
说出两个选择:
将idTable与4个UNIONed表的子选项加在一起:
select ss.id, ss.study, ss.status, ss.date
from ( -- subselect ss
select tx.id, tx.study, tx.status, tx.date
from table_tx tx
UNION
select cfu.id, cfu.study, cfu.status, cfu.date
from table_cfu cfu
UNION
select sfu.id, sfu.study, sfu.status, sfu.date
from table_sfu sfu
UNION
select bsl.id, bsl.study, bsl.status, bsl.date
from table_bsl bsl
) ss
inner join
idTable id on id.id = ss.id AND id.study = ss.study
idTable的联盟加入了四个中的每一个:
select tx.id, tx.study, tx.status, tx.date
from table_tx tx
inner join
idTable id on id.id = tx.id AND id.study = tx.study
UNION
select cfu.id, cfu.study, cfu.status, cfu.date
from table_cfu cfu
inner join
idTable id on id.id = cfu.id AND id.study = cfu.study
UNION
select sfu.id, sfu.study, sfu.status, sfu.date
from table_sfu sfu
inner join
idTable id on id.id = sfu.id AND id.study = sfu.study
UNION
select bsl.id, bsl.study, bsl.status, bsl.date
from table_bsl bsl
inner join
idTable id on id.id = bsl.id AND id.study = bsl.study
或者除了这些之外还有更好的选择吗?
答案 0 :(得分:0)
这将取决于您的数据在每个表中的行数方面的样子,因此您最好的选择是尝试两种方法并查看是否更好。
但是,如果我假设你的每个表tx,cfu,sfu和bsl都包含一百万行,那么我希望在联合它们之前将这4个大型集合限制为单个行会更快,而不是创建一个400万行集然后加入它。
答案 1 :(得分:0)
SQL Server可以将第一个转换为第二个而不是相反的转换。
那就是说,没有办法知道哪个更好,因为它取决于很多东西(行数,过滤器选择性......)。唯一合理的答案是查看计划和/或测试。