2

パフォーマンス向上のためにサンプル ストアド プロシージャ (MS SQL 2008R2) を微調整し、ベスト プラクティスに従うための専門家のアドバイスを探しています。

私の要件を説明するために、以下のサンプル手順を作成しました。

手順は次のことを行う必要があります

  1. パラメータに基づいてフィルタリングする必要があります。

  2. 例に基づいてデータを並べ替えます@SortExpressionCode DescまたImpDate ASC

  3. レコード セット全体の合計レコード数を返します。

  4. レコード セット全体のフィールドの合計を返します。

  5. startRowIndex最後に、ページ サイズに基づいてレコード セットのサブセットのみを返します。

    CREATE PROCEDURE [dbo].[_getlist](@CompanyID      VARCHAR(10),
                              @IsPaid         VARCHAR(3),
                              @Code           VARCHAR(10) = NULL,
                              @ImpDate        DATETIME = NULL,
                              @BatchNo        INT,
                              @StartRowIndex  INT,
                              @PageSize       INT,
                              @SortExpression VARCHAR(50),
                              @TotalAmount    NUMERIC(15, 2) output,
                              @RecordCount    INT output)
    AS
    BEGIN
       DECLARE @SortDirection VARCHAR(10)
    
       SET @SortDirection = 'ASC'
    
       IF RIGHT(@SortExpression, 5) = ' DESC'
          SET @SortDirection = 'DESC'
    
       DECLARE @SortColumn VARCHAR(50)
    
       SELECT @SortColumn = Replace(@SortExpression, ' ASC', '')
    
       SELECT @SortColumn = Replace(@SortColumn, ' DESC', '')
    
       DECLARE @StartIndex INT,
               @EndIndex   INT
    
       SET @StartIndex = @StartRowIndex
       SET @EndIndex = @StartRowIndex + @PageSize -- (@CurrentPage + 1 )
    
       SELECT data.,
         Row_number()
           OVER (
             ORDER BY CASE WHEN @SortDirection = 'DESC' THEN CASE WHEN
           @SortColumn
           =
           'code' THEN data.client_code END END DESC, CASE WHEN
           @SortDirection
           =
           'ASC'
           THEN CASE WHEN @SortColumn = 'code' THEN data.client_code END END
           ASC )
         AS
         RowNumber
     INTO   #temptable
     FROM   (SELECT *
             FROM   clients
             WHERE  is_local = 'Yes'
                 AND is_paid = 'No'
                 AND status = 'Valid'
                 AND ( company_id = @CompanyID )
                 AND ( ispaid = @IsPaid
                        OR @IsPaid IS NULL )
                 AND ( code = @Code
                        OR @Code IS NULL )
                 AND ( @ImpDate IS NULL
                        OR import_date = @ImpDate )
                 AND ( @BatchNo = 0
                        OR batch_no = @BatchNo )) AS data
    
      SELECT @RecordCount = Count(*)
      FROM   #temptable
    
      SELECT @TotalAmount = Sum(total_tax)
      FROM   #temptable
    
      SELECT *
      FROM   #temptable
      WHERE  rownumber >= @StartIndex
             AND ( rownumber <= @EndIndex OR @PageSize = -1 )
    
      DROP TABLE #temptable
    END  
    

サンプルは要件を説明するためのものです。私を助けてくれるどんな助けにも本当に感謝しています。

更新: 前に述べたように、これは要件を伝えるための単なるサンプルです。

これがクライアントテーブルスキーマです

CREATE TABLE [dbo].[Client](   
    [ID] [int] IDENTITY(1,1) NOT NULL,   
    [CODE] [char](10) NULL,   
    [COMPANY_ID] [char](6) NOT NULL,   
    [CLIENT_ID] [char](6) NOT NULL,   
    [IMP_DATE] [datetime] NOT NULL,   
    [BATCH_NO] [int] NOT NULL,   
    [YTD_Total] [numeric](15, 2) NOT NULL,   
    [STATUS] [char](5) NOT NULL,   
    [MODIFY_DATE] [datetime] NOT NULL,   
    [MODIFY_BY] [varchar](20) NOT NULL,   
    [NOTES] [varchar](100) NULL,   
    [ISPAID] [char](3) NOT NULL,   
    [msrepl_tran_version] [uniqueidentifier] NOT NULL   
)      

ありがとう、

4

1 に答える 1

1

T-SQL を使用したページングについては、SQL Server Common Table Expressions を参照することをお勧めします。このリンクの例 #2 を参照してください。

http://www.mssqltips.com/sqlservertip/1699/sql-server-stored-procedures-to-page-large-tables-or-queries/

パフォーマンス メトリックは一番下にリストされています。一時テーブルを使用するよりもはるかに高速で効率的であることがわかります (例 #1)。

于 2013-10-08T21:23:41.553 に答える