我有一张桌子ACCPLAN(PRIMARY KEY:ACCOUNT_ID)
ACCOUNT_ID PLAN_TYPE OTHER_STUFF
ACC1 PLAN_TYPE_ONE ....
ACC2 PLAN_TYPE_TWO ....
ACC3 PLAN_TYPE_ONE ....
ACC4 PLAN_TYPE_TWO ...
我还有一个表ACCTRANSACTION(PRIMARY KEY - >(ACCOUNT_ID,TRANSACTION_ID)
ACCOUNT_ID TRANSACTION_ID TRANSACTION_AMOUNT TXN_TYPE
ACC1 1 100 TXN_TYPE_1
ACC1 2 300 TXN_TYPE_2
ACC2 1 400 TXN_TYPE_2
ACC3 1 400 TXN_TYPE_3
有5个固定的plan_types和20个固定的txn_types。只有很少的交易类型 每个plan_type都可以。(例如:TXN_TYPE_1和TXN_TYPE_2可能用于 PLAN_TYPE_TWO可以使用PLAN_TYPE_ONE和TXN_TYPE_2以及TXN_TYPE_3
我正在尝试从ACCTRANSACTION和其他中检索交易信息 来自ACCPLAN的详细信息
这可以通过两种方式完成
方法1
检索每个plan_type并执行联合
select ap.account_id,ap.other_stuff,at.transaction_amount
from accplan ap, acctransaction at
where ap.account_id = at.account_id
and ap.plan_type = PLAN_TYPE_ONE
and at.txn_type in (TXN_TYPE_1,TXN_TYPE_2);
union
select ap.account_id,ap.other_stuff,at.transaction_amount
from accplan ap, acctransaction at
where ap.account_id = at.account_id
and ap.plan_type = PLAN_TYPE_TWO
and at.txn_type in (TXN_TYPE_2,TXN_TYPE_3);
union
...
APPROACH 2
使用一个查询检索所有plan_types
select ap.account_id,ap.other_stuff,at.transaction_amount
from accplan ap, acctransaction at
where ap.account_id = at.account_id
and
((ap.plan_type = PLAN_TYPE_ONE and at.txn_type in (TXN_TYPE_1,TXN_TYPE_2))
or
(ap.plan_type = PLAN_TYPE_TWO and at.txn_type in (TXN_TYPE_2,TXN_TYPE_3));
考虑到两个表都有庞大的数据,哪种方法更好?请建议。
答案 0 :(得分:2)
使用联接。联合需要对整个结果进行排序,这对您的数据库来说是一项昂贵的操作。
此外。最好一次读取表格并对每条记录进行一些复杂的检查,而不是只读几次以进行较小的检查。
免责声明:我可以想象一些非常奇怪的极端情况,如果数据库查询计划程序确定大条件不够有选择性并且不使用索引而每个较小的条件确实使用它,则第一个查询运行得更快。行数越多,我使用第二个选项就越多。