Nested-loop join( 内表和驱动表联结方式) 适合于小表(几千条,几万条记录)与大表做联接,在联接列上有索引 分内表和外表(驱动表),靠近from子句的是内表。从效率上讲,小表应该作外表,大表应该作内表,即大表查询时走索引 COST= Access cost of A(驱动表) + (access cost of B * number of rows from A)
sozdream大哥既然看出来了,那能说说有什么办法能提高我第一种方法的效率吗?
shyming,我的大表,就是表A,这么放应该没有问题吧?
A.fdate between to_date('2006-01-01', 'yyyy-MM-dd') and to_date('2006-06-30', 'yyyy-MM-dd')如果非要用第一种方法, 那就在这个字段上放个索引吧, 因为A表行数多, 建索引查询起来快。 不过要看你A.fdate的数据情况, 如果重复性很高的话, 那索引建了虽然可以提高速度, 但不划算, 尽量建在A表重复性低,没什么null值的字段上。
select sum(FBAL) / 181 as famount from T_A A LEFT JOIN T_B B on A.fportfoliocode = B.fportfoliocode and A.facctcode = B.facctcode AND B.fyear = '2006' where A.fdate between to_date('2006-01-01', 'yyyy-MM-dd') and to_date('2006-06-30', 'yyyy-MM-dd') and B.facctattr like '银行存款_定期%' and B.FacctDetail = 1 and A.fcurrencycode = 'RMB' and and A.fportfoliocode in ('000001', '000004') 如果慢,在Toad工具里解析看看索引的使用情況,A.fportfoliocode in ('000001', '000004')應該也會用到索引的。
适合于小表(几千条,几万条记录)与大表做联接,在联接列上有索引
分内表和外表(驱动表),靠近from子句的是内表。从效率上讲,小表应该作外表,大表应该作内表,即大表查询时走索引
COST= Access cost of A(驱动表) + (access cost of B * number of rows from A)
to_date('2006-06-30', 'yyyy-MM-dd')如果非要用第一种方法, 那就在这个字段上放个索引吧, 因为A表行数多, 建索引查询起来快。 不过要看你A.fdate的数据情况, 如果重复性很高的话, 那索引建了虽然可以提高速度, 但不划算, 尽量建在A表重复性低,没什么null值的字段上。
from T_A A LEFT JOIN T_B B on A.fportfoliocode = B.fportfoliocode and A.facctcode = B.facctcode AND B.fyear = '2006'
where A.fdate between to_date('2006-01-01', 'yyyy-MM-dd') and
to_date('2006-06-30', 'yyyy-MM-dd')
and B.facctattr like '银行存款_定期%' and B.FacctDetail = 1
and A.fcurrencycode = 'RMB' and
and A.fportfoliocode in ('000001', '000004')
如果慢,在Toad工具里解析看看索引的使用情況,A.fportfoliocode in ('000001', '000004')應該也會用到索引的。
add primary key (FACCTATTR,FPORTFOLIOCODE,FACCTCODE,FYEAR)
using index
tablespace YSSZT
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);这应该是我现在索引的建立SQL