我正在开发 SQL Server 2012 Express 和开发人员版(带有最新的 Service Pack)解决方案。
在我的数据库中,我有一个CODES
带有代码的表。该表有一FLAG
列指示代码已被打印、读取或删除。代码按另一列分组,LEVEL
。CODES
表有CODE
和LEVEL
作为主键。
我将很快更新表 CODES,如果我确实SELECT COUNT(code) FROM CODES WHERE FLAG=1
要读取所有代码,有时我会阻止该表,当我们有很多行时,SELECT COUNT
CPU 会达到 100%。
所以,我有另一个表,STATISTICS
用于存储codes
已打印、读取或删除的数量。当我更新CODES
表中的一行时,我将 1 添加到STATISTICS
表中。我试过这两种方法:
用UPDATE
更新CODES
表后的语句。
declare @printed bigint;
set @printed = (Select CODES_PRINTED from STADISTICS where LEVEL = @level)
if (@printed is null)
begin
insert dbo.STADISTICS(LEVEL, CODES_PRINTED) values (@level, 1)
end
else
begin
update dbo.STADISTICS set CODES_PRINTED = (@printed + 1) where LEVEL = @level;
end
带有一个TRIGGER
在 CODES 表中。
ALTER trigger [dbo].[UpdateCodesStatistics] on [dbo].[CODES]
after update
as
SET NOCOUNT ON;
if UPDATE(FLAG)
BEGIN
declare @flag as tinyint;
declare @level as tinyint;
set @flag = (SELECT FLAG FROM inserted);
set @level = (SELECT LEVEL FROM inserted);
-- If we have printed a new code
if (@flag = 1)
begin
declare @printed bigint;
set @printed = (Select CODES_PRINTED from STADISTICS where LEVEL = @level)
if (@printed is null)
begin
insert dbo.STADISTICS(LEVEL, CODES_PRINTED) values (@level, 1)
end
else
begin
update dbo.STADISTICS set CODES_PRINTED = (@printed + 1) where LEVEL = @level;
end
end
END
但在这两种情况下,我都丢失了数据。运行我的程序后,我检查CODES
表格和STATISTICS
表格,统计数据不匹配:我打印的代码和读取的代码STATISTICS
比CODES
表格中的少。
这是STATISTICS
我现在使用的表:
CREATE TABLE [dbo].[BATCH_STATISTICS](
[CODE_LEVEL] [tinyint] NOT NULL,
[CODES_REQUESTED] [bigint] NOT NULL CONSTRAINT [DF_BATCH_STATISTICS_CODES_REQUESTED] DEFAULT ((0)),
[CODES_PRINTED] [bigint] NOT NULL CONSTRAINT [DF_BATCH_STATISTICS_CODES_PRINTED] DEFAULT ((0)),
[CODES_READ] [bigint] NOT NULL CONSTRAINT [DF_BATCH_STATISTICS_CODES_READ] DEFAULT ((0)),
[CODES_DROPPED] [bigint] NOT NULL CONSTRAINT [DF_BATCH_STATISTICS_CODES_DROPPED] DEFAULT ((0)),
[CODES_NOREAD] [bigint] NOT NULL CONSTRAINT [DF_BATCH_STATISTICS_CODES_NOREAD] DEFAULT ((0)),
CONSTRAINT [PK_BATCH_STATISTICS] PRIMARY KEY CLUSTERED
(
[CODE_LEVEL] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
顺便说一句,我更新和插入的速度非常快(一分钟超过 1200 行)。
知道发生了什么或我怎样才能做得更好?