查询记录数在上亿条SQL效率问题,请教高手

liutjedu 2010-12-29 09:36:44
假设表A有字段a, b, c, d四个字段,a, b, c, d均为主索引,表A数据量在亿级别。
SQL语句如下:select * from A where a=:a and b=:b and c>=:c and d<=:d,其中以:开头的均为传递过来的数据,且注意c,d字段,c>=:c and d<=:d,实在没有办法,只能这么写该查询条件,并非是between..and。

如果使用物化查询表,个人认为不太适合,因为A表不需要GROUP BY统计,经常会变化。

想请教高手,这样的SQL语句如何提供查询效率? 先谢谢了
...全文
554 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
liutjedu 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zhaojianmi1 的回复:]
恭喜啊

引用 13 楼 liutjedu 的回复:

不好意思,很久没来了,主要因为当爸爸了,忙啊。。。我先重新好好看到大家的回复吧。。。
[/Quote]
非常感谢
liutjedu 2011-07-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 liutjedu 的回复:]
假设表A有字段a, b, c, d四个字段,a, b, c, d均为主索引,表A数据量在亿级别。
SQL语句如下:select * from A where a=:a and b=:b and c>=:c and d<=:d,其中以:开头的均为传递过来的数据,且注意c,d字段,c>=:c and d<=:d,实在没有办法,只能这么写该查询条件,并非是between..and。

如果使用物化……
[/Quote]
我还是没有和大家说的很清楚,不好意思。
表A数据量在亿级别。表A有字段a, b, c, d,e,f六个字段,索引按顺序是a,b,d,表已经是按字段a进行分区的,数据在上亿条,SQL语句如下:select * from A where a=:a and b=:b and c>=:c and d<=:d,这样SQL响应就会慢些。后来我们修改了索引,改为a,b,c,d,效率就上来了。

其实从db2性能上来说,主要还是因为索引的不匹配,如果是修改前的方案的话,DB2自身只能找到索引a,b,而d的索引是没有用到的,这样DB2自身将会对满足a,b条件的所有数据进行扫描,直至找到满足等于c的字段后,但是由于c是大于等于的条件,因此d的索引还是没有用到。
如果是修改后的方案的话,DB2自身只能找到索引a,b,同样d的索引是没有用到的,这样DB2自身将会对满足a,b条件的所有数据进行扫描,并通过c的索引直接点位到c=:c的位置,之后浏览大于c的所有数据。

修改前后相比,少用的时间是定位到c=:c的位置的时间,在上亿条的数据上,这样的效率是非常明显的。

谢谢大家对此贴的关注。

liutjedu 2011-07-27
  • 打赏
  • 举报
回复
不好意思,很久没来了,主要因为当爸爸了,忙啊。。。我先重新好好看到大家的回复吧。。。
zhaojianmi1 2011-07-27
  • 打赏
  • 举报
回复
恭喜啊[Quote=引用 13 楼 liutjedu 的回复:]

不好意思,很久没来了,主要因为当爸爸了,忙啊。。。我先重新好好看到大家的回复吧。。。
[/Quote]
wuzhaoyoung 2011-01-18
  • 打赏
  • 举报
回复
想关注这个帖子。楼主继续出来说吧。研究得咋样了。
zhiliyang 2011-01-12
  • 打赏
  • 举报
回复
贴出 index 吧
对于这个sql来说,index 里面 column 的顺序如果是 C,D,A,B 的话,其效率和 A,B,C,D 的效率相去甚远滴
yangaqun 2011-01-04
  • 打赏
  • 举报
回复
如果你有quest central for db2的话,在tune Sql里查访问计划。
也可以在命令行方式用下列方法,查访问计划:
db2 connect to 数据库名
db2 "explain plan for select * from A where a=:a and b=:b and c>=:c and d<=:d"
db2exfmt

ACMAIN_CHM 2010-12-30
  • 打赏
  • 举报
回复
[Quote]分区都做了,索引也做了[/Quote]

贴出你的
SHOW INDEX还有 EXPLAIN select * from A where a=:a and b=:b and c>=:c and d<=:d

以供进一步分析,否则大家只能泛泛而谈。
zhaojianmi1 2010-12-30
  • 打赏
  • 举报
回复
做成mdc表,关键字是organized by(1,2)
你是按什么做的分区
liutjedu 2010-12-30
  • 打赏
  • 举报
回复
分区都做了,索引也做了。注意where条件c,d字段,c>=:c and d<=:d,不是c between :c and :d.
zhaojianmi1 2010-12-29
  • 打赏
  • 举报
回复
做分区表,并且做成MDC表
liutjedu 2010-12-29
  • 打赏
  • 举报
回复
楼上的:a,b,c,d已经全部是索引了。
yangxiao_jiang 2010-12-29
  • 打赏
  • 举报
回复
加索引

另外,在加上with ur,如果你要的不是特别精确的话。
lament_gates 2010-12-29
  • 打赏
  • 举报
回复
对数据库进行分区.建索引~~~

5,889

社区成员

发帖
与我相关
我的任务
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
  • DB2
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧