0

SQL Server 2012 Express および開発者版 (最新の Service Pack 付き) ソリューションを開発しています。

私のデータベースには、CODESコードを含むテーブルがあります。このテーブルには、コードが印刷読み取り、または削除されたことを示すFLAG列があります。コードは、別の列でグループ化されます。テーブルには主キーとしてandがあります。LEVELCODESCODELEVEL

テーブル CODES を非常に迅速に更新します。SELECT COUNT(code) FROM CODES WHERE FLAG=1すべてのコードを読み取ろうとすると、いつかそのテーブルをブロックします。多数の行がある場合、SELECT COUNTCPU は 100% になります。

そのため、印刷、読み取り、またはドロップされたSTATISTICS数を格納する別のテーブルがあります。codesテーブルの行を更新すると、CODESテーブルに 1 が追加されSTATISTICSます。私はこの2つの方法を試しました:

テーブル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インコードテーブル付き。

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

ちなみに、更新と挿入は非常に高速です (1 分間に 1200 行以上)。

何が起こっているのか、どうすればもっとうまくできるのでしょうか?

4

1 に答える 1