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

您可以在标识列上放置一个主键(索引),这可能会使其性能更好:

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

另外,您最终是否将 table 变量用于其他任何事情?为什么不这样做呢?

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 回答
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 回答