sqlserverページングクエリー
8186 ワード
SQLServerのデータページング:
CREATE TABLE test(id int primary key not null identity,names varchar(20))では約1000個のデータを挿入し、ページングテストを行います.クエリ文は次のとおりです.--10はページングのサイズselect top 10*from testwhere id not inを表します.--40はこのように計算されます.10*(5-1)select top 40 id from test order by id)order by id
原理:データベースの5ページ目を出す必要があります.40-50の記録です.まず、データベースの上位40レコードのid値を取り出し、残りの10要素を取り出します.
2つ目の方法は、上記の結果を例に、データの意味が上記と同じであるselect top 10*from testwhere id>(select isnull(max(id)、0)from(select top 40 id from test order by id)A)order by id原理を採用することである.では、0を返し、id値が上位40レコードの最大id値より大きいレコードをクエリーします.このクエリにはidがintタイプでなければならないという条件があります.
3つ目の方法:select top 10*from(select row_number()over(order by id)as rownumber,*from test)Awhere rownumber>40原理:テーブル内のすべてのデータを1つのrowNumberでソートし、rownuberが40より大きい上位10のレコードをクエリーする方法はoracleの1つのページング方式と似ているが、2005バージョン以上の
4つ目:ストアド・プロシージャ・クエリーストアド・プロシージャalter procedureの作成pageDemo@pageSizeint,@page intASdeclare@temp intset@temp=@pageSize*(@page-1)begin select top(select@pageSize)*from test where id not in(select top(select@temp)id from test)order by ided実行ストレージプロセス
exec 10,5
Sql Serverページ分割クエリ百万レベルデータの4つのプロジェクトインスタンス
CREATE TABLE test(id int primary key not null identity,names varchar(20))では約1000個のデータを挿入し、ページングテストを行います.クエリ文は次のとおりです.--10はページングのサイズselect top 10*from testwhere id not inを表します.--40はこのように計算されます.10*(5-1)select top 40 id from test order by id)order by id
原理:データベースの5ページ目を出す必要があります.40-50の記録です.まず、データベースの上位40レコードのid値を取り出し、残りの10要素を取り出します.
2つ目の方法は、上記の結果を例に、データの意味が上記と同じであるselect top 10*from testwhere id>(select isnull(max(id)、0)from(select top 40 id from test order by id)A)order by id原理を採用することである.では、0を返し、id値が上位40レコードの最大id値より大きいレコードをクエリーします.このクエリにはidがintタイプでなければならないという条件があります.
3つ目の方法:select top 10*from(select row_number()over(order by id)as rownumber,*from test)Awhere rownumber>40原理:テーブル内のすべてのデータを1つのrowNumberでソートし、rownuberが40より大きい上位10のレコードをクエリーする方法はoracleの1つのページング方式と似ているが、2005バージョン以上の
4つ目:ストアド・プロシージャ・クエリーストアド・プロシージャalter procedureの作成pageDemo@pageSizeint,@page intASdeclare@temp intset@temp=@pageSize*(@page-1)begin select top(select@pageSize)*from test where id not in(select top(select@temp)id from test)order by ided実行ストレージプロセス
exec 10,5
Sql Serverページ分割クエリ百万レベルデータの4つのプロジェクトインスタンス
実際のプロジェクトではカスタムページングを実現する必要があります.最も重要な第一歩は、ページングSQL文を書くことです.文の効率が高いことが要求されます.
では、本明細書のクエリーの例は、100000〜100000、50番目のレコード、すなわち、ページ当たり50番目の結果セットをクエリーすることである.クエリのテーブル名はinfoTabで、idは整数の自己増加プライマリ・キー・フィールドです.
第一に、NOT INキーワードを使うSELECT TOP 50 * FROM infoTab WHERE ID NOT IN(SELECT TOP 100000 ID FROM infoTab)
平均クエリー時間0.1 s.これは非常に簡単な書き方で、効率はまあまあですが、デフォルトのIDを使ってソートするだけで、IDが切れていると、展示効果がよくありません.
第二に、昇順と降順でページングクエリーを実現するSELECT * FROM (SELECT TOP 50 * FROM (SELECT TOP 100050 * FROM infoTab ORDER BY ID ASC)TEMP1 ORDER BY ID DESC)TEMP2 ORDER BY ID ASC
平均クエリー時間0.22 s.これは,先に逆シーケンスを問合せた50個のデータを用いて,最後に昇順ソートを行う方法が複雑で,使用を推奨せず,最も時間を浪費し,効率が最も低い.
第三に、MAX(ID)関数を採用
実際にはMIN()関数とMAX()関数の使用についてSELECT TOP 50 * FROM infTab WHERE ID>(SELECT MAX(ID) FROM (SELECT TOP 100000 ID FROM infoTab ORDER BY ID)temp)
平均クエリー時間0.13 s.この方法は、MAX()を直接使用して検索し、idがMAX()より大きい結果が100000の最初の50レコードが結果であることを理解するのが簡単である.
4つ目、最後におすすめの使い方、ROW_を使いますNUMBER
Oracleのrowidのように、IDフィールド全体が不連続な問題が解決されました.ロー番号(ROW_NUMBER)で照会すると、比較的効率的な照会方法は、SQL Server 2005以降でのみサポートされます.
注意したのは、ROW_NUMBERの後ろにOVER(ORDER BY[FIELD])が付いていなければならないので、具体的な書き方を見てみましょう.SELECT * FROM (SELECT TOP 100050 ROW_NUMBER() OVER(ORDER BY ID ASC) AS rowid,* FROM infoTab)t WHERE t.rowid > 100000
平均運転時間0.29 s.この方法の利点は,連続的なソートROWIDを実現し,IDの間欠的不連続の問題を回避し,より美しく示すことである.
ここで注意しなければならないのは、OVERのカッコに複数のソートフィールドを書くことです.例えば、OVER(ORDER BY CreatedTime、ID)です.
次の文を使用すると、上の文の実行時間の3分の1になり、平均実行時間は0.08 sにすぎません.SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ID ASC) AS rowid,* FROM infoTab)t WHERE t.rowid > 100000 AND t.rowid <= 100050
要するに、第4の方法のうちの次の文を使用することをお勧めします.クエリーの効率が高く、結果が美しく、ROWIDが連続しています.特に、千万レベルのデータクエリーの場合、効率の差が非常に大きいです.
(すべてのSQL文が実測に合格し、直接プロジェクトで使用できます.)
SELECT TOP 50 * FROM infoTab WHERE ID NOT IN(SELECT TOP 100000 ID FROM infoTab)
SELECT * FROM (SELECT TOP 50 * FROM (SELECT TOP 100050 * FROM infoTab ORDER BY ID ASC)TEMP1 ORDER BY ID DESC)TEMP2 ORDER BY ID ASC
SELECT TOP 50 * FROM infTab WHERE ID>(SELECT MAX(ID) FROM (SELECT TOP 100000 ID FROM infoTab ORDER BY ID)temp)
SELECT * FROM (SELECT TOP 100050 ROW_NUMBER() OVER(ORDER BY ID ASC) AS rowid,* FROM infoTab)t WHERE t.rowid > 100000
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ID ASC) AS rowid,* FROM infoTab)t WHERE t.rowid > 100000 AND t.rowid <= 100050