为什么 CREATE Temporary TABLE 然后 INSERT INTO Temporary TABLE SELECT... FROM (方式1) 的速度比 SELECT... INTO TEMP (方式2)慢很多
如果配置参数 DBSPACETEMP 指定两个及以上的数据库空间
一、 以方式1创建的临时表将在某个指定的数据库空间创建临时表。
以上见:《IBM Informix SQL 指南:语法.pdf》11.50版本中的第273页
如果创建多个临时表,则临时表会分别创建在不同的数据库空间上。
举例:
% dbaccess fmdb -
Database selected.
> create temp table t1(c1 int);
Temporary table created.
> create temp table t2(c1 int);
Temporary table created.
> SELECT trim(n.dbsname) type,
> trim(n.owner) users,
> trim(n.tabname) table,
> trim(dbinfo('DBSPACE', i.ti_partnum)) dbspace,
> round(i.ti_nptotal*4,0) kb -- 4 for AIX, 2 for HP-UX
> FROM sysmaster:systabnames n, sysmaster:systabinfo i
> WHERE (sysmaster:bitval(i.ti_flags, 32) = 1
> OR sysmaster:bitval(i.ti_flags, 64) = 1
> OR sysmaster:bitval(i.ti_flags, 128) = 1)
> AND i.ti_partnum = n.partnum
> ;
type fmdb
users informix
table t1dbspace tmpdbs01
kb 32
type fmdb
users informix
table t2dbspace tmpdbs02kb 32
2 row(s) retrieved.
>
可见:每一次创建临时表时所使用的数据库空间都会与上一次创建临时表的数据库空间不一样。
二、 以方式2创建表则临时表会循环分片存贮在 DBSPACETEMP 指定的数据库空间上。
以上见:《IBM Informix SQL 指南:语法.pdf》11.50版本中的第273页
举例:
% dbaccess fmdb -
Database selected.
> select * from systables into temp t1;
88 row(s) retrieved into temp table.
> SELECT trim(n.dbsname) type,
> trim(n.owner) users,
> trim(n.tabname) table,
> trim(dbinfo('DBSPACE', i.ti_partnum)) dbspace,
> round(i.ti_nptotal*4,0) kb -- 4 for AIX, 2 for HP-UX
> FROM sysmaster:systabnames n, sysmaster:systabinfo i
> WHERE (sysmaster:bitval(i.ti_flags, 32) = 1
> OR sysmaster:bitval(i.ti_flags, 64) = 1
> OR sysmaster:bitval(i.ti_flags, 128) = 1)
> AND i.ti_partnum = n.partnum
> ;
type fmdb
users informix
table t1dbspace tmpdbs01kb 32
type fmdb
users informix
table t1dbspace tmpdbs02kb 32
type fmdb
users informix
table t1dbspace tmpdbs03kb 32
3 row(s) retrieved.
>
可见:临时表 t1 被分片到 3 个数据库空间上。
对存储过程 sysmaster:bitval 的说明:
{ Stored procedure for setting boolean 'columns' in views for flags values }
create procedure bitval ( bitset int, bitmask int) returning int;
if (bitset < 0) then
if (bitmask < 0) then
return 1;
end if;
let bitset = bitset + 2147483648;
end if;
if (bitset > 1073741824) then
if (bitmask = 1073741824) then
return 1;
end if;
end if
if (mod(bitset,2*bitmask) >= bitmask) then
return 1;
end if
return 0;
end procedure;
grant execute on bitval to public;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22565551/viewspace-1033310/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22565551/viewspace-1033310/