我有两个看起来像这样的表:
table A: FieldID NUMBER (PK), other non-relevant fields
table B: FieldID NUMBER (PK/FK), other non-relevant fields
表格映射1:0..1关系。具体来说,在表A中插入新行之后,在将来的某个时刻,表B将填充其他数据。
此设计最初优于独特的扩展表,因此在任何地方都有不可为空的字段(因为无法预测何时将填充“B”部分数据)。
现在......来自A和B的连接选择的表现非常糟糕。我们在谈论两个表中的几十行,但是简单的内部联接需要花费大量的时间才能完成。
除了从A中的B移动字段(我不想做的事情是避免额外的“空”检查),我怎样才能提高我的表现?
答案 0 :(得分:1)
您的加入是这样的:SELECT /*+GATHER_PLAN_STATISTICS*/ ... FROM .. WHERE ...;
然后,向我们展示输出:SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));
这将显示执行计划及相关统计信息,如执行查询时估计和实际找到的那样。
答案 1 :(得分:1)
如果你将所有行的两个表等同加入,那么你应该从散列连接中获得最佳性能。如果可以缓存较小的连接数据集,则成本仅略高于两个表的完整扫描,这与您可以获得的效率相当。
如果您只加入少量行而不是散列簇可能会有所帮助,因为它在物理上共同定位两个表的行,并使连接对于少量行非常有效。缺点是任何一个,特别是较小的表的完整扫描将更昂贵,插入也将如此。