Informix 9.40 的 DBINFO('sqlca.sqlerrd1') 性能低下
low performance by DBINFO('sqlca.sqlerrd1') of Informix 9.40
插入一行后,我使用 DBINFO('sqlca.sqlerrd1') 读取插入行的序列号。 select 过程需要很长时间(5 - 10 秒)。
为了进行分析,我在插入命令
之前打开了 sqexplain
set explain on;
load from x insert into transaction;
SELECT distinct dbinfo('sqlca.sqlerrd1') FROM transaction;
输出:
QUERY:
------
SELECT distinct dbinfo('sqlca.sqlerrd1') FROM transaction
Estimated Cost: 353490
Estimated # of Rows Returned: 10
1) cms.transaction: SEQUENTIAL SCAN
我执行更新统计:
update statistics medium for table transaction;
但这没有帮助。为什么 SQL-Engine 执行顺序扫描?
如果我搜索 :
SELECT MAX (sernr ) from transaction;
(其中 sernr 是序列字段)SQL-带索引的引擎搜索。
这里输出:
QUERY:
------
SELECT MAX (sernr ) from transaction
Estimated Cost: 4
Estimated # of Rows Returned: 1
1) cms.transaction: INDEX PATH
(1) Index Keys: sernr (Key-Only) (Aggregate) (Serial, fragments: ALL)
我应该怎么做才能提高性能?
当您使用
SELECT distinct dbinfo('sqlca.sqlerrd1') FROM transaction;
您实际上正在读取 table transaction
中的所有行,return 正在读取每行中的 DBINFO('sqlca.sqlerrd1')
值。由于值始终相同,因此不同的只会 return 1 行。
你只需要 1 行,所以你可以使用这样的东西:
SELECT DBINFO('sqlca.sqlerrd1') FROM systables WHERE tabid = 1;
插入一行后,我使用 DBINFO('sqlca.sqlerrd1') 读取插入行的序列号。 select 过程需要很长时间(5 - 10 秒)。 为了进行分析,我在插入命令
之前打开了 sqexplainset explain on;
load from x insert into transaction;
SELECT distinct dbinfo('sqlca.sqlerrd1') FROM transaction;
输出:
QUERY:
------
SELECT distinct dbinfo('sqlca.sqlerrd1') FROM transaction
Estimated Cost: 353490
Estimated # of Rows Returned: 10
1) cms.transaction: SEQUENTIAL SCAN
我执行更新统计:
update statistics medium for table transaction;
但这没有帮助。为什么 SQL-Engine 执行顺序扫描? 如果我搜索 :
SELECT MAX (sernr ) from transaction;
(其中 sernr 是序列字段)SQL-带索引的引擎搜索。 这里输出:
QUERY:
------
SELECT MAX (sernr ) from transaction
Estimated Cost: 4
Estimated # of Rows Returned: 1
1) cms.transaction: INDEX PATH
(1) Index Keys: sernr (Key-Only) (Aggregate) (Serial, fragments: ALL)
我应该怎么做才能提高性能?
当您使用
SELECT distinct dbinfo('sqlca.sqlerrd1') FROM transaction;
您实际上正在读取 table transaction
中的所有行,return 正在读取每行中的 DBINFO('sqlca.sqlerrd1')
值。由于值始终相同,因此不同的只会 return 1 行。
你只需要 1 行,所以你可以使用这样的东西:
SELECT DBINFO('sqlca.sqlerrd1') FROM systables WHERE tabid = 1;