请高手帮忙看看
有两个查询语句
select * from A,B where A.时间=B.时间-1 (+) and A.ID=B.ID (+) and A.时间='200804'
select * from A,B where A.时间=B.时间-1 (+) and A.ID=B.ID (+) and B.时间='200804'
注: (+)表示外连接A表每个月30万条记录(共有记录1000万),B表每个月10万条记录(共有记录300万),
两个表都按时间(月)分区
A表建立了复合索引ON(时间,ID),B表建立了复合函数索引ON(时间-1,ID),并通过复合索引字段进行外连接问:为什么用A表时间作为条件只需40秒,而用B表时间作为条件却需要180秒,当一定要用B表时间做条件,有无办法提高其查询效率
有两个查询语句
select * from A,B where A.时间=B.时间-1 (+) and A.ID=B.ID (+) and A.时间='200804'
select * from A,B where A.时间=B.时间-1 (+) and A.ID=B.ID (+) and B.时间='200804'
注: (+)表示外连接A表每个月30万条记录(共有记录1000万),B表每个月10万条记录(共有记录300万),
两个表都按时间(月)分区
A表建立了复合索引ON(时间,ID),B表建立了复合函数索引ON(时间-1,ID),并通过复合索引字段进行外连接问:为什么用A表时间作为条件只需40秒,而用B表时间作为条件却需要180秒,当一定要用B表时间做条件,有无办法提高其查询效率
而b表数据量小。B.时间='200804' 过滤的数据比A少
这个有点问题,为什么不是:B表建立了复合函数索引ON(时间, ID)呢?
有关系呀,B表建立了复合函数索引ON(时间-1,ID) === 这个索引是函数索引。
因为两个表的关联是用A.时间=B.时间-1,所以B表建立了复合函数索引ON(时间-1,ID)
关联用A.时间=B.时间-1 (+) and A.ID=B.ID (+) 索引on B(时间, id),这样岂不是用不上索引?
select * from A,B where A.时间=B.时间-1 (+) and A.ID=B.ID (+) and B.时间='200804'
上面两个语句中第二个语句实际上结果和
select * from A,B where A.时间=B.时间-1 and A.ID=B.ID and B.时间='200804'
是等效的,但执行计划很不一样,实际上你的语句被实现有不必要的外联接.修改你的语句为下面等效语句,相信查询会快很多