2

ここでは、一時テーブルのレコード数を知り、別の変数に渡そうとしているので、実行プランテーブルスキャンに約100%表示されていました。

私がやっていた以下のクエリを見つけてください

DECLARE @tmpANHdr TABLE (
  hdrId          INT IDENTITY,
  CBFId          NVARCHAR(32),
  ACPT_REJ_FLAG  NVARCHAR(8),
  PROC_FILE_NAME NVARCHAR(50))

INSERT INTO @tmpANHdr
SELECT TOP 100 AHR_CB_FTS_FILE_ID,
               AHR_ACCT_REJ_FLAG,
               AHR_PROC_FILE_NAME
FROM   FTS_ACK_NAK_HEADER WITH (NOLOCK)
WHERE  AHR_FLAG IS NULL
        OR AHR_FLAG = 0

DECLARE @varRecordCount INT

SELECT @varRecordCount = Count(1)
FROM   @tmpANHdr

SET @varIndex = 1

IF( @varIndex <= @varRecordCount )
  BEGIN
      PRINT 'hi'
  END 
4

2 に答える 2

2

100行以下のテーブル変数のスキャンは、とにかくかなり安価である可能性があります。テーブルスキャン操作は、ステートメントの計画の100%でコストがかかる可能性がありますが、それはかなり少数の100%です。

@@rowcount以下のように挿入後を見るだけで、このコストを完全に回避できます。

DECLARE @varRecordCount INT;

INSERT INTO @tmpANHdr
SELECT TOP 100 AHR_CB_FTS_FILE_ID,
               AHR_ACCT_REJ_FLAG,
               AHR_PROC_FILE_NAME
FROM   FTS_ACK_NAK_HEADER WITH (NOLOCK)
WHERE  AHR_FLAG IS NULL
        OR AHR_FLAG = 0

SET @varRecordCount = @@ROWCOUNT 
于 2012-09-23T11:15:32.083 に答える
2

ID列に主キー(インデックス)を配置すると、パフォーマンスが向上する可能性があります。

DECLARE @tmpANHdr TABLE (
  hdrId          INT IDENTITY PRIMARY KEY,
  CBFId          NVARCHAR(32),
  ACPT_REJ_FLAG  NVARCHAR(8),
  PROC_FILE_NAME NVARCHAR(50))

また、他の目的でテーブル変数を使用することになりますか?なぜこれをしないのですか?

DECLARE @varRecordCount INT

SELECT @varRecordCount = Count(TOP 100 *)
FROM   FTS_ACK_NAK_HEADER WITH (NOLOCK)
WHERE  AHR_FLAG IS NULL
        OR AHR_FLAG = 0
于 2012-09-23T19:25:26.530 に答える