簡體   English   中英

如何通過使用sql server緩存記錄數時減少臨時表掃描的成本

[英]how can we reduce the cost of temp table scan while feching count of records by using sql server

在這里,我只是想知道臨時表中的記錄數並傳遞給另一個變量,因此它在執行計划表掃描中顯示了大約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 

無論如何,對不超過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 

您可以在標識列上放置一個主鍵(索引),這可能使其性能更好:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM