2016-01-31 19:06:06 | 分类: 操作系统 | 标签: | 举报 | 字号 大 中 小 订阅
用微信 “扫一扫”
将文章分享到朋友圈。
用易信 “扫一扫”
将文章分享到朋友圈。
问题:
表A,表B
A(c1, c2),大表,复合索引(c1,c2),数据是有序的,先按c1排序,然后按c2排序,样例数据如下:
1 1
1 2
1 2
1 2
1 3
2 1
2 1
2 2
表B(c1, c2, c3),小表,最多8000条记录,,每一行中c1是表A的外键,<c2,c3>描述的是一个interval,例如[1,3]
表B中行与行之间的interval没有交集,换句话说,前一行中c3的值小于后一行中的c2值
表B的样例数据如下:
1 1 2
2 2 4
3 1 4
现有查询为
select A.c1, A.c2
from A, B
where A.c1 = B.c1 and
A.c2 between B.c2 and B.c3
问题:如何使用sort-merge查询优化策略
目前optimizer使用的是,对于B表的每一个记录,都会触发A表的一个index scan,性能感觉不理想
回复:
---1 什么数据库?MySQL不支持sort-merge,PG支持
---2 PG中,优先优化器算出的结果,是最好的结果,“如何使用sort-merge查询优化策略”交给优化器执行决定,最好不要强制决定
---3 优化器执行时,常规情况下是小表优先的,所以按描述B表应优先。所以,先更新一下A表和B表的统计信息,再看看执行计划和执行效果
---4 如果想看看强制改变后的效果,可以禁止掉索引扫描(如PG有参数可以指定),可以强制表的连接次序(MySQL可以做到)
--- 如使用如下参数在PG中设置:enable_hashjoin、enable_indexscan、enable_mergejoin、enable_nestloop
---5 如果查询语句的语义,是要查询出很多结果(几乎要扫描每个表的大部分元组),那么禁止索引扫描是有意义的
阅读( 6 ) | 评论( 0 )
用微信 “扫一扫”
将文章分享到朋友圈。
用易信 “扫一扫”
将文章分享到朋友圈。