请教informix问题(100分)!

cooth 2004-10-25 03:11:21
一、对于大数据量,8000w以上的表,导入数据后如何可以建主键?

二、假如先建立主键再导入数据比较慢(onpload)

由于需要在5个小时内搞定,各位是否有好的方案,3x!

(未建主键大约为2.5小时导入,主键建不上。建立主键后再导数据为10小时以上。)
...全文
363 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly83522 2004-11-26
  • 打赏
  • 举报
回复
呵呵,大家都很专业啊!这里真是卧虎藏龙啊……
zzjijun 2004-11-25
  • 打赏
  • 举报
回复

1、可以使用onpload

2、可以直接load

3、可以参考以下步骤
(1)创建表为RAW方式
(2)load导入数据
(3)将表改为STANDARD方式
(4)使用PDQ创建索引:可以按 ly83522(大男人学Linux) 说的值去调整
与PDQ有关的参数:
MAX_PDGPRIORITY
DS_TOTAL_MEMORY
DS_MAX_QUERYS
DS_MAX_SCANS

PSORT_NPROCS

修改参数的方法
1、在onconfig文件中修改
2、使用onmode命令调整(不用重启数据库)
3、通过环境变量设置(例如PSORT_NPROCS)
4、用SQL语句设置(例如PDQPRIORITY)

to:mgan(路遥知马力!!!) 使用PDQ没问题,修改PDQ参数不用重新连接操作系统内核,修改onconfig中的PDQ参数不会导致DOWN机

to: christian_dindin(石之轩) 一张表8000w的数据是比较大,不过一张表上亿的记录数也见过不少,用的恰当话Informix没问题。
mgan 2004-11-21
  • 打赏
  • 举报
回复

【 INFORMIX数据库压缩备份工具】

为突破单个表文件不能超过2G大小的限制、并节约库备份所占文件系统空间,特编写此
工具.
--------------------------------------------------------------------------
程序组成:
1.Zunload 压缩库生成工具,用于将指定数据库直接压缩成一个个"表名.unl.Z", 存放
目录为当前目录下
以数据库名命名的子目录.

使用方法:Zunload [DBNAME]

2.Zload 压缩库上载工具,用于将指定目录下的压缩备份上载到指定空间里的指定数据
库中.
使用方法:Zload [DIR] [DBNAME] [DBSPACE]


--------------------------------------------------------------------------

特别说明:



#######################################################################
#程序描述:将指定目录下的表压缩备份文件上载到指定dbspaces上的命名数据库中

#######################################################################

define dbname,dbsname varchar(20)
define dirname varchar(100)
define tab_name varchar(20)
define str,str1 varchar(255)
define run_str char(1000)
define c_str,c_str1 char(18)
define arg_nums smallint
define f_pipo varchar(100)
define i,j smallint
define p_pre_time datetime hour to second
define laps_time interval hour to second
define flag smallint

main
if num_args() <>3 then
display "参数错误!!!"
display "使用方法:Zload [DIR] [DBNAME] [DBSPACE]"
display "例如 :Zload aa1 aa1_name workdbs"
exit program(1)
end if
clear screen
display "【 INFORMIX数据库压缩备份工具】" at 12,22
sleep 2

let dirname=arg_val(1)
let dbname=arg_val(2)
let dbsname=arg_val(3)
display "正在将",dirname,"目录中的压缩库文件上载到",dbsname,"空间的",dbname,"
let f_pipo="p_pipo"
###建立库机构
let p_pre_time=time
display "正在建立",dbname,"库结构..."
let str="dbaccess sysmaster<<!\n",
"create database ",dbname," in ",dbsname,";\n",
"!\n"
#display str
run str
let str="cd ",dirname,";",
"dbaccess ",dbname," ",dirname,".sql 1>/dev/null 2>&1"
run str

let c_str=dbname
database c_str
let i=0 let j=0
select count(*) into j from systables
where tabid>99

###循环上载压缩文件到库表中
call mk_pipe()
call disable_all()
display "开始将压缩文件中的表上载到",dbname,"库中..."
declare cur1 cursor for
select tabname from systables
where tabid >99
foreach cur1 into tab_name
let tab_name=tab_name clipped
let i=i+1
display "正在上载",tab_name,"表...(",i using "<<<<<<<","/",j using "<<<<<<<"
let run_str="cd ",dirname,";"
let run_str=run_str clipped,
"zcat ",tab_name,".unl.Z >",f_pipo,"&"
run run_str returning flag

let run_str="cd ",dirname,";"
let run_str=run_str clipped,
"dbaccess ",dbname,"<<!\n",
"load from ",f_pipo," insert into ",tab_name,";\n",
"!\n"
let run_str="echo '",run_str clipped,"' >$$;. $$ 1>/dev/null 2>&1 ;cd ..;rm"
##display run_str
run run_str
#exit foreach
end foreach
call rm_pipe()
call enable_all()
let laps_time=extend(current,hour to second) - p_pre_time
display "恭喜!上载成功!共用时",laps_time
end main

function enable_all()
define i smallint
let i=0
display "正在启用所有关联、触发器..."
whenever error continue
for i=0 to 1
declare cur41 cursor for
select tabname from systables
where tabid>99

foreach cur41 into tab_name
let tab_name=tab_name clipped
let str= "set constraints for ",tab_name," enabled;"
prepare s3 from str
execute s3
let str= "set triggers for ",tab_name," enabled;"
prepare s4 from str
execute s4
end foreach
whenever error stop
end for
end function

function disable_all()
define tab_name varchar(20)
define str varchar(255)
define i smallint

let i=0
display "正在禁止所有关联、触发器..."
whenever error continue
for i=0 to 2
declare cur3 cursor for
select tabname from systables
where tabid>99

foreach cur3 into tab_name
let tab_name=tab_name clipped
let str= "set constraints for ",tab_name," disabled;"
#display str
prepare s1 from str
execute s1
let str= "set triggers for ",tab_name," disabled;"
prepare s2 from str
#display str
execute s2
end foreach
whenever error stop
end for
end function

function rm_pipe()
define str varchar(255)
define tab_name varchar(20)
define flag smallint


let str="cd ",dirname,";ls ",f_pipo ," 1>/dev/null 2>&1"
run str returning flag
if flag=0 then
let str="cd ",dirname,";rm ",f_pipo," 1>/dev/null 2>&1"
run str
end if
##end foreach
end function

function mk_pipe()
define str varchar(255)
define flag smallint
let str="cd ",dirname,";ls ",f_pipo ," 1>/dev/null 2>&1"
run str returning flag
if flag=0 then
let str="cd ",dirname,";rm ",f_pipo," 1>/dev/null 2>&1"
run str
end if
let str="cd ",dirname,";mkfifo ",f_pipo
run str
end function
##############################################################
#程序功能:将指定库下载成压缩unload文件,以突破每个表文件2G限制

##############################################################
define dbname varchar(20)
define tab_name varchar(20)
define f_name varchar(40)
define str,str1 varchar(255)
define run_str char(1000)
define c_str,c_str1 char(18)
define i,j int
define p_pre_time datetime hour to second
define laps_time interval hour to second

main
if num_args()<>1 then
display "参数错误!!!"
display "使用方法:Zunload [DBNAME]"
display "例如 :Zunload picc2"
exit program(1)
end if
clear screen
display "【 INFORMIX数据库压缩备份工具】" at 12,22
sleep 2
let dbname=arg_val(1) #取指定备份数据库名称
display "您所备份的数据库名称:",dbname
let p_pre_time=time
###建立数据库目录
display "建立",dbname,"目录..."
let str="mkdir ",dbname
run str

let c_str=dbname
database c_str
###取库结构
let i=0 let j=0
select count(*) into j from systables
where tabid>99

display "正在取库结构..."
let str="cd ",dbname,";dbschema -d ",dbname," -ss ",dbname,".sql 1>/dev/null "
run str
###循环备份表
display "开始备份表数据..."
declare cur1 cursor for
select tabname from systables
where tabid >99
foreach cur1 into tab_name
let tab_name=tab_name clipped
let i=i+1
display "正在备份",tab_name ,"...(",i using "<<<<<<<","/",j using "<<<<<<","
let run_str="cd ",dbname,";\n"
let run_str=run_str clipped,
"dbaccess ",dbname," <<!\n",
"unload to /dev/stdout select * from ",tab_name,";\n",
"!\n"
let run_str="echo '",run_str clipped,"'>$$;. $$"
let run_str=run_str clipped," 2>/dev/null|compress >",dbname,"/",tab_name,""
#display run_str
run run_str
#exit foreach
end foreach
let laps_time=extend(current,hour to second) - p_pre_time
display "恭喜!备份成功!共用时",laps_time
end main
mgan 2004-11-20
  • 打赏
  • 举报
回复
to ly83522(大男人学Linux)
不知道你这种做法 安全否?
一般如果涉及到如此大数据的 应该公司规模不会小
数据应该也是相当重要
一般设置PDQ参数:

需要重新核心连接的吧 (这个刚接触不是很了解 还要多指教)
一般修改online 如果有问题 很容易DOWN机的

个人认为如果就一张表的话 且没有什么很多的关联
可否先UNLOAD数据
然后 drop表
重新建表 建主键
(建立索引 很重要 可以建适当的索引,虽然时间长 但以后 好处多多 尤其你这么大的数据!)
load 数据

但是这样先请确保数据的安全性!!!
ly83522 2004-11-17
  • 打赏
  • 举报
回复
我有个工程做过的,表数据文件5G多,用IPLOAD分几个文件导出,要导入到表里前,先将表结构导出,然后将语句中的主键,索引的语句全部删除,这样就大大的加快了ONPLOAD的导入数度
关于再次建立主键和索引的问题,建议先改INFORMIX的配置文件,修改如下:
如下设置PDQ参数:

onconfig中: shmvirtsize 100M (建议为实际可用内存的75%)

DS-TOTAL_MEMORY SHMVIRTSIZE的90% (不用重启数据库即生效)

用户的.cshrc中:setenv PSORT_NPROCS 6 (CPU个数)

set pdqpriority 100; 表示决策支持查询分配100%的PDQ资源,将获得最高的执行速


倒出数据时设置脏读:set isolation to dirty read;
这样建立索引和主键速度奇快无比(相对而言)
注意修改完配置后,必须重新启动数据库!!!!
lzx130 2004-11-01
  • 打赏
  • 举报
回复
weastsea是何用意
一点点凋落 2004-10-30
  • 打赏
  • 举报
回复
这么大的数据量用informix本身就是个错误
iamsmile 2004-10-28
  • 打赏
  • 举报
回复
表大的话当然是先建好SCHEMA(包括INDEX,PK等),然后用程序来COPY(以INSERT CURSOR)或dbload来实现,有兴趣联系:qq: 412612004 (非同行者勿扰)
weastsea 2004-10-26
  • 打赏
  • 举报
回复
先把主键删除
alter table tb_name
drop constraint ?;

alter table tb_name add constraint FK_TS_*;
weastsea 2004-10-26
  • 打赏
  • 举报
回复
是否可以尝试
INSERT INTO dbname@servername:new_tb_name SELECT * FROM tb_name
cooth 2004-10-26
  • 打赏
  • 举报
回复
主键无法建上,就算能建,时间是N长,无法实现。

1,194

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 Informix
社区管理员
  • Informix社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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