SQL Server 2012 Express および開発者版 (最新の Service Pack 付き) ソリューションを開発しています。
私のデータベースには、CODES
コードを含むテーブルがあります。このテーブルには、コードが印刷、読み取り、または削除されたことを示すFLAG
列があります。コードは、別の列でグループ化されます。テーブルには主キーとしてandがあります。LEVEL
CODES
CODE
LEVEL
テーブル CODES を非常に迅速に更新します。SELECT COUNT(code) FROM CODES WHERE FLAG=1
すべてのコードを読み取ろうとすると、いつかそのテーブルをブロックします。多数の行がある場合、SELECT COUNT
CPU は 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 行以上)。
何が起こっているのか、どうすればもっとうまくできるのでしょうか?