パフォーマンス向上のためにサンプル ストアド プロシージャ (MS SQL 2008R2) を微調整し、ベスト プラクティスに従うための専門家のアドバイスを探しています。
私の要件を説明するために、以下のサンプル手順を作成しました。
手順は次のことを行う必要があります
パラメータに基づいてフィルタリングする必要があります。
例に基づいてデータを並べ替えます
@SortExpression
。Code Desc
またImpDate ASC
レコード セット全体の合計レコード数を返します。
レコード セット全体のフィールドの合計を返します。
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
)
ありがとう、