设某商品经营管理系统使用SQL Server 2000数据库管理系统。在数据库中存在销售明细表,其建表语句为:
CREATE TABLE销售明细表(
销售单据编号varchar(8),
商品编号varchar(8)
单价money,
数量int,
总价money
)
为了保证数据的一致性,建有如下触发器:
CREATE TRIGGER AutoCountSum
ON 销售明细表 FOR INSERT, UPDATE
AS
DECLARE @UnitPrice money, @Quantity int
DECLARE @Amount money
SELECT @UnitPrice=单价,@Quantity=数量
FROM inserted
SET @Amount=@UnitPrice[*]@Quantity
UPDATE销售明细表SET总价=@Amount
WHERE销售单据编号IN(SELECT销售单据编号FROM inserted)
AND商品编号IN(SELECT商品编号FROM inserted)
1.设系统运行一段时间后此表中有近一百万条记录,此时发现对该表的插入操作速度很慢,请分析插入速度慢的原因。在不改变数据库服务器硬件和表结构、不清理数据的情况下,请说明应如何优化此表的插入操作。
参考答案:由于数据库中有100万个记录,执行“update销售明细表set总价=@Amount”,需要执行100万次,因此插入操作比较慢。
解析: AFTER触发器和INSTEAD OF触发器。其中AFTER类型触发器要求只有执行某一操作(INSERT UPDATE DELETE)之后,触发器才被触发,且只能在表上定义,如果仅指定FOR关键字,则AFTER是默认设置。
INSTEAD OF触发器表示并不执行其所定义的操作(INSERT、UPDATE、DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD OF触发器,也可以在视图上定义INSTEAD OF触发器,但对同一操作只能定义一个INSTEAD OF触发器。
优化措施,采用INSTEAD OF触发器。即for改为instead of