効率的なページング(制限)クエリにSQLServer2000?
-
20-08-2019 - |
質問
のうえで、最も効率的に行うには、ページングのクエリをSQLServer2000?
が"ページングのクエリ"に相当する利用の制限算書、イナリを使用しています。
編集:ができるのかということ保管手続をより効率的な設定に基づく照会その場合は?
解決
ページング大結果セットのと勝者は行カウントを使用しています。また、より複雑なクエリのための一般的なバージョンがあります。 しかしに信用を与えるのジャスミン・マヘアモビックの:)
DECLARE @Sort /* the type of the sorting column */
SET ROWCOUNT @StartRow
SELECT @Sort = SortColumn FROM Table ORDER BY SortColumn
SET ROWCOUNT @PageSize
SELECT ... FROM Table WHERE SortColumn >= @Sort ORDER BY SortColumn
の記事は、全体のソースコードが含まれています。
「更新2004-05-05」の情報をお読みください。 !
他のヒント
私は、ネストされたSELECT TOP n
クエリは、おそらくそれを達成するための最も効率的な方法だと思います。
SELECT TOP ThisPageRecordCount *
FROM Table
WHERE ID NOT IN (SELECT TOP BeforeThisPageRecordCount ID FROM Table ORDER BY OrderingColumn)
ORDER BY OrderingColumn
ThisPageRecordCount
でページとBeforeThisPageRecordCount
あたりの項目で(PageNumber - 1) * items-per-page
を交換します。
もちろん、SQL Server 2005でより良い方法は、CTEでROW_NUMBER()
機能を使用することです。
クエリの効率は本当に基本となるテーブルが構成されている方法によって異なります。 、あなたはIDENTITYあるIDと呼ばれる主キー、を持っているとの言うなら、それは、クラスタ化インデックス、のだとのあなたは誰もがそれにIDENTITY_INSERTsをやっていないされていますと仮定することができ、あなたが行うことができます以下のようなクエリます:
ID> @LastPagesIDテーブルのトップXXXを選択します。
これはできるだけ速くあなたに結果を得ることができます。本当に効率的になるだろうそれ以外はこの上でいくつかの変種です - 多分それはIDではないのですが - 多分あなたがページに使用していることは、実際にあなたがユニークであることを知っているが、あなたはポイントを得る日付です...ここに示されている()ベースのクエリではおそらく動作しますが、彼らは部分的にクラスタ化された又は被覆インデックス・スキャンのパフォーマンスには触れません。
いと思ったんはやむを得ない事由にアップグレードSQLでは2005年。
アプリケーションでは2005年のこ迅速に行うことができ、簡単に:
select ROW_NUMBER() over (order by [MyField]) as rowNum, *
from [MyTable]
where rowNum between @firstRow and @lastRow
だっSQL2000んも安心-Microsoftかを全力でサポートでの長さである二代ます。
がなくなるわけではありませんつういん-すべての解決策はちょっとhacks.
@ペタル-ペトの回答は、おそらく最も一貫したのに対し
- ばを扱うクラスタ化されたインデックスが小さいテーブルごうのASC-DESCの方法(動的にビルの二種類それぞれの方法を使用)であろう。
- 場合データは比較的静やソートに固定して追加できます自分のrowNum分野での更新を変更したときにソート順(音恐ろしいで迅速に大きいテーブルに対して).
と思いながら、いくつかの時間調整のエ装置。保存されている論文集できな大きな違いはどちらのキャッシュのクエリのプランはないと考えられるときに、ボトルネックです。
これは、任意のテーブルの上に改ページを行います汎用のSQL Server 2000のストアドプロシージャです。ストアドプロシージャは、(テーブルのすべての列にデフォルト)、任意の条件、オプションのソート順序、取得するページ番号とページあたりの行数を出力するテーブルの名前、列を受け付ける。
CREATE PROCEDURE [dbo].[GetPage]
@pTableName VARCHAR(30),
@pColumns VARCHAR(200) = '*',
@pFilter VARCHAR(200) = '',
@pSort VARCHAR(200) = '',
@pPage INT = 1,
@pPageRows INT = 10
AS
SET NOCOUNT ON
DECLARE @vSQL VARCHAR(4000)
DECLARE @vTempTable VARCHAR(30)
DECLARE @vRowStart INT
DECLARE @vTotalRows INT
SET @vTempTable = '##Tmp' + CAST(DATEPART(YYYY, GETDATE()) AS VARCHAR(4)) +
CAST(DATEPART(MM, GETDATE()) AS VARCHAR(2)) +
CAST(DATEPART(DD, GETDATE()) AS VARCHAR(2)) +
CAST(DATEPART(HH, GETDATE()) AS VARCHAR(2)) +
CAST(DATEPART(MI, GETDATE()) AS VARCHAR(2)) +
CAST(DATEPART(SS, GETDATE()) AS VARCHAR(2)) +
CAST(DATEPART(MS, GETDATE()) AS VARCHAR(3))
SET @vSQL = 'SELECT ' + @pColumns + ', IDENTITY(INT, 1, 1) AS ROWID INTO ' + @vTempTable + ' FROM ' + @pTableName
IF @pFilter != '' AND @pFilter IS NOT NULL
SET @vSQL = @vSQL + ' WHERE ' + @pFilter
IF @pSort != '' AND @pSort IS NOT NULL
SET @vSQL = @vSQL + ' ORDER BY ' + @pSort
EXECUTE (@vSQL)
-- Get the total number of rows selected
SET @vTotalRows = @@ROWCOUNT
-- If page number = 0, set it to the first page
IF @pPage = 0
SET @pPage = 1
-- If page number is beyond the last page, set page to the last page
IF (@pPage * @pPageRows) > @vTotalRows
BEGIN
SET @pPage = @vTotalRows / @pPageRows
IF (@vTotalRows % @pPageRows) != 0
SET @pPage = @pPage + 1
END
SET @vRowStart = ((@pPage - 1) * @pPageRows) + 1
SET @vSQL = 'SELECT * FROM ' + @vTempTable + ' WHERE ROWID BETWEEN ' + CAST(@vRowStart AS VARCHAR(10)) +
' AND ' + CAST((@vRowStart + @pPageRows - 1) AS VARCHAR(10)) + ' ORDER BY ROWID'
EXECUTE (@vSQL)
SET @vSQL = 'DROP TABLE ' + @vTempTable
EXECUTE (@vSQL)
GO
ここでNorthwingデータベースを使用して、それを使用する方法のいくつかの例です。
EXECUTE [dbo].[GetPage] 'Customers', '*', '', '', 1, 10
EXECUTE [dbo].[GetPage] 'Customers', '*', '', 'CustomerID DESC', 1, 10
を確認するには、これは私の仕事ではなく、の礼儀であります http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=1055
乾杯、ジョン