DB2 处理效率优化问题

扶瑶直上 2013-03-14 07:48:25
--------------以下是前提--------------------
目前有一个表A,数据量300万,表A有主键KEY。
还有表B、C、D,这三张表也包含了表A这个主键KEY的列,但主键不是它。这三张表都以这个KEY这一列做了索引。表B、C的数据量有1亿,表D的数据量有3亿。
--------------以下是问题--------------------
现在我需要根据表A中的数据来拿表BCD中的数据(某些列),然后写入另外一个表E。
由于数据量的庞大,简单的select;insert效率非常低下,处理完表A这三百万的数据库得花很长时间。我把表A拆成了10份,做了一个并行处理,时间还是达不到要求。请各位大神支招,能从架构上解决这个问题。


...全文
788 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yumao 2013-04-07
  • 打赏
  • 举报
回复
引用 8 楼 carl6148 的回复:
引用 7 楼 kensum2099 的回复:引用 5 楼 carl6148 的回复:引用 3 楼 kensum2099 的回复:1: INSERT表用去掉LOG处理 2: 建中间运算过程表你好,去log的insert是怎么实现的?我没有遇到过这种情况,望指导。中间运算过程表可以给一个参考的例子吗?谢谢你! 1. 只不过是CREATE TABLE的时候加NOT L……
1. 指定表空间, 我的是这样: CREATE TABLE AAAA.BBBB ( ...... ) IN "MAINSPACE2" NOT LOGGED INITIALLY ; 2. 始终要安情况而定, 重复取数越多, 用临时表越快, 在编程时候做优化比较。
climer 2013-04-01
  • 打赏
  • 举报
回复
引用 11 楼 carl6148 的回复:
引用 10 楼 climer 的回复:不知道BCD表是否还会经常做别的用,是否经常更新,你查询的列多不多。如果不是的话我觉得可以用空间换时间。在创建索引的时候用INCLUDE,把要查询的列放进去。 这样的话你做这个操作会快些,但是BCD表更新时效率会降低。你好,BCD表会有实时联机的交易会访问的。就是因为如此,才觉得此问题很难解决。
暂时也没什么好办法了,看有没有大神能解决此问题。
climer 2013-03-29
  • 打赏
  • 举报
回复
不知道BCD表是否还会经常做别的用,是否经常更新,你查询的列多不多。如果不是的话我觉得可以用空间换时间。在创建索引的时候用INCLUDE,把要查询的列放进去。 这样的话你做这个操作会快些,但是BCD表更新时效率会降低。
扶瑶直上 2013-03-29
  • 打赏
  • 举报
回复
引用 10 楼 climer 的回复:
不知道BCD表是否还会经常做别的用,是否经常更新,你查询的列多不多。如果不是的话我觉得可以用空间换时间。在创建索引的时候用INCLUDE,把要查询的列放进去。 这样的话你做这个操作会快些,但是BCD表更新时效率会降低。
你好,BCD表会有实时联机的交易会访问的。就是因为如此,才觉得此问题很难解决。
扶瑶直上 2013-03-27
  • 打赏
  • 举报
回复
这帖子要埋没了,顶一下!
扶瑶直上 2013-03-20
  • 打赏
  • 举报
回复
引用 7 楼 kensum2099 的回复:
引用 5 楼 carl6148 的回复:引用 3 楼 kensum2099 的回复:1: INSERT表用去掉LOG处理 2: 建中间运算过程表你好,去log的insert是怎么实现的?我没有遇到过这种情况,望指导。中间运算过程表可以给一个参考的例子吗?谢谢你! 1. 只不过是CREATE TABLE的时候加NOT LOGGED INITIALLY到最后一行, ……
kensum2099,你好!我查了一下手册,其中有这么一段话:
Do not specify LOGGED or NOT LOGGED if the table space name is specified by using the IN table-space-name clause.
因为我们的规范是一定要手工建表空间,建表时候要指定表空间名,所以这种方式应该行不通了。 第二种方法的思路是这样吗?先通过一定的规则筛选出符合的记录,保存在零时表,然后以后的操作用零时表来代替原来的大表。但这样的话,多出来的筛选这一步耗费的时间应该也不会少吧。
yumao 2013-03-18
  • 打赏
  • 举报
回复
引用 5 楼 carl6148 的回复:
引用 3 楼 kensum2099 的回复:1: INSERT表用去掉LOG处理 2: 建中间运算过程表你好,去log的insert是怎么实现的?我没有遇到过这种情况,望指导。中间运算过程表可以给一个参考的例子吗?谢谢你!
1. 只不过是CREATE TABLE的时候加NOT LOGGED INITIALLY到最后一行, 我的经验是被INSERT的表, 大约有数十万条, 用了NOT LOGGED INITIALLY后时间减20-30%. 2. 不是每种运算都可以用, 要看计算内容, 如果在过程内经常查取某一条件的数据, 就可以用CREATE GLOBAL TEMPORARY TABLE 先另存这个条件的数据, 这样就不用每次都直接去查取亿条记录的表了. 如果长期要用的, 也可以用固定表代替临时表.
yumao 2013-03-17
  • 打赏
  • 举报
回复
1: INSERT表用去掉LOG处理 2: 建中间运算过程表
扶瑶直上 2013-03-17
  • 打赏
  • 举报
回复
引用 4 楼 zhaojianmi1 的回复:
中间过程见一些临时表,并且给临时表加索引,并且runstats,这个需要用存储过程来做
你好!有具体的中间运算过程的例子可以给我看看吗?我不太明白如何实现这个技术。
扶瑶直上 2013-03-17
  • 打赏
  • 举报
回复
引用 3 楼 kensum2099 的回复:
1: INSERT表用去掉LOG处理 2: 建中间运算过程表
你好,去log的insert是怎么实现的?我没有遇到过这种情况,望指导。中间运算过程表可以给一个参考的例子吗?谢谢你!
zhaojianmi1 2013-03-17
  • 打赏
  • 举报
回复
中间过程见一些临时表,并且给临时表加索引,并且runstats,这个需要用存储过程来做
扶瑶直上 2013-03-16
  • 打赏
  • 举报
回复
引用 1 楼 Mr_Bean 的回复:
如果可能的话 对比那三个表reorg 和runstats前后的执行时间看看
其实我的意思是想换一种实现方式,能够更快速的实现这个功能。runstats定期会做的。
Mr_Bean 2013-03-15
  • 打赏
  • 举报
回复
如果可能的话 对比那三个表reorg 和runstats前后的执行时间看看

5,889

社区成员

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

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