转载

SQL优化实例问答---

SQL优化实例问答---

2016-01-31 19:06:06 |  分类: 操作系统 |  标签: | 举报 | 字号   订阅

     

用微信  “扫一扫”

将文章分享到朋友圈。

 
SQL优化实例问答---

用易信  “扫一扫”

将文章分享到朋友圈。

 
  下载LOFTER 我的照片书  |

问题:

表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 )

     
SQL优化实例问答---

用微信  “扫一扫”

将文章分享到朋友圈。

 
SQL优化实例问答---

用易信  “扫一扫”

将文章分享到朋友圈。

 
喜欢 推荐 转载

历史上的今天

在LOFTER的更多文章

评论

原文  http://blog.163.com/li_hx/blog/static/1839914132016031766303
正文到此结束
Loading...