INFORMIX SQL 实践与技巧(2)

---摘自互联网

如何更改serial类型下一次插入操作产生的值?

我们知道serial类型的字段是系统自动增加的整数字段,那么怎样能控制下一个serial类型字段的值。

想要下一个插入的serial类型的值比默认值大,可以用:

ALTER TABLE tabname MODIFY( ser_col_name SERIAL([new_start_number])

想要下一个插入的serial类型的值比默认的值要小,首先需要将serial类型重新置为1:

INSERT INTO table (serial_column) VALUES (2147483647);

INSERT INTO table (serial_column) VALUES (0); -- 重新从1开始!

....然后执行ALTER TABLE(就像上面的做法一样)。

 

如何在发生错误的时候终止sql脚本的执行?

如果你创建了一个sql脚本,并且在UNIX命令行中使用以下的方式来执行这个脚本:

$ dbaccess <database> <脚本文件名>

这时,脚本中的所有的sql语句都会被执行,即使其中的一个sql语句发生了错误。例如,如果你脚本中为如下的语句:

BEGIN WORK;

INSERT INTO history

SELECT *

FROM current

WHERE month = 11;

DELETE FROM current

WHERE month = 11;

COMMIT WORK;

如果INSERT语句失败了,DELETE语句仍旧会继续执行。直到commit work。这样的后果可能会很严重。你可以通过设置一个环境变量来防止这种情况的发生。

DBACCNOIGN=1

 

如何设置decimal字段运算结果的精度?

假定你使用dbaccess或者isql,设置环境变量DBFLTMASK=6 就可以设置为小数点后面6位,比如:

CREATE TEMP TABLE t

( col_a DECIMAL(8,4) NOT NULL,

col_b DECIMAL(8,4) NOT NULL,

col_c DECIMAL(8,4) NOT NULL

);

INSERT INTO t VALUES(1.2345, 3.4567, 5.6789);

SELECT (col_a + col_b) / col_c AS value FROM t;

value 0.826075

如果DBFLTMASK=7

value 0.8260755

 

为什么我们有时会遇到sysprocplan表被锁的提示?

sysprocplan表是sysmaster库中的一个表,其中记录存储过程经过优化的查询计划。每当查询树中的数据库对象有任何结构上的变化,这个查询计划就会自动更新。如果对查询树中存在的任何表有update statistics操作,也会自动更新查询计划。在查询计划更新的时候,会对sysporcplan表中的相关记录加锁。

注意:每次你对一个表更新统计的时候,也同时会更新于这个表相关的存储过程,即UPDATE STATISTICS FOR PROCEDURE 。

你可以作的另外一件事情就是:在存储过程中使用SET OPTIMIZATION LOW,这会让优化器在存储过程运行的时候不会试图去重新优化它。否则存储过程通常都会被重新优化一次。

 

如何删除掉表中重复的记录?

假设“keycol”字段的值唯一,而且没有对表进行分片,并且没有其它的人正在删除"sometable"中的记录,你可以执行如下的SQL:

delete from sometable as a

where rowid <> (select min(rowid) from sometable where keycol = a.keycol)

如果这个表使用表分片,rowid不存在,你还可以用如下的方法:

BEGIN WORK;

SELECT DISTINCT * FROM Table INTO TEMP Temp1;

DELETE FROM Table WHERE 1 = 1;

INSERT INTO Table SELECT * FROM Temp1;

COMMIT WORK;

对于规模较小或中等的表,并且你有足够的存储空间来存储整个的临时表的时候,这种方法通常十分有效。

 

如何加快SELECT COUNT(DISTINCT)的速度。

通常“SELECT COUNT(DISTINCT)”这样的操作要花费比较长的时间,如果你这样作:

SELECT UNIQUE xxx INTO TEMP XXX " 然后再"SELECT COUNT(*) FROM TEMP XXX"

这样通常可以提高几倍的效率。