0

我正在开发 SQL Server 2012 Express 和开发人员版(带有最新的 Service Pack)解决方案。

在我的数据库中,我有一个CODES带有代码的表。该表有一FLAG指示代码已被打印读取删除。代码按另一列分组,LEVELCODES表有CODELEVEL作为主键

我将很快更新表 CODES,如果我确实SELECT COUNT(code) FROM CODES WHERE FLAG=1要读取所有代码,有时我会阻止该表,当我们有很多行时,SELECT COUNTCPU 会达到 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表格,统计数据不匹配:我打印的代码和读取的代码STATISTICSCODES表格中的少。

这是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 行)。

知道发生了什么或我怎样才能做得更好?

4

1 回答 1

0

inserted并且deleted可以包含多个(或没有)行。所以像这样的成语set @flag = (SELECT FLAG FROM inserted)从根本上被打破了。根据您的描述,听起来索引视图可能对您有用,如下所示:

CREATE VIEW dbo.Statistics
WITH SCHEMABINDING
AS
    SELECT LEVEL, COUNT_BIG(*) as CODES_PRINTED
    FROM dbo.Codes
    WHERE Flag = 1
    GROUP BY LEVEL

和:

CREATE UNIQUE CLUSTERED INDEX IX_Statistics ON dbo.Statistics (LEVEL)

现在 SQL Server 将(在幕后)自动维护这些数据,您不必编写任何触发器(或显式维护单独的表)

于 2014-11-25T07:48:50.933 回答