4つの効率的なSqlServerページング方式

12133 ワード

リスト情報を表示するときは、ASP.NETのListViewやGridViewコントロールなどはページング機能を備えていますが、効率が低く、大量のデータを適用できず、柔軟性が高くありません.したがって、サードパーティ製のページングコントロールまたは自分でページングプログラムを作成するのが一般的です.ADOに基づく.NETでカスタムページングを実現する最初のステップ、つまり最も重要なステップは、ページングSQL文を書くことであり、文の効率が高いことです.もちろん、本稿の目的の一つは、ページングクエリー文の作成を学ぶことであり、もう一つの目的は、初心者がSELECT文をより深く理解することを助けることです.
では、本明細書のクエリの例は、クエリ11〜15のレコード、すなわち、各ページ5のレコードであり、3ページ目に含まれる結果セットを調べる.クエリーのビュー名はLeaveWordViewです.このビューにはIDという整数の自己増加プライマリ・キー・フィールドがあります.
さて、私が今引き出したい最初の書き方は、NOT INキーワードを使うことです.
--IN   NOT IN,    
--
11-15 , ADO.NET Command CommandText
SELECT TOP 5 * FROM LeaveWordView WHERE ID NOT IN(SELECT TOP 10 ID FROM LeaveWordView)
--SELECT TOP PageSize * FROM LeaveWordView WHERE ID NOT IN(SELECT TOP (PageIndex-1)*PageSize ID FROM LeaveWordView)

この文の原理は、まず1~10個の記録のIDを照会してから、IDがこの1~10個の記録のIDに属していないことを照会し、5個の記録しか必要としないことです.1ページあたりのサイズが5であるため、これが取得した11~15個目の記録であり、非常に簡単な書き方です.また、IN文はNOT IN文と似ています.これはNOT INの書き方ですが、効率が低すぎるため、私たちのニーズに達していません.2つ目の書き方を見てみましょう
2つ目の書き方もかなり分かりやすく、いくつかの昇順と降順で実現されています.
--               
SELECT * FROM(
SELECT TOP 5 * FROM(
SELECT TOP 15 * FROM LeaveWordView ORDER BY ID ASC)
AS TEMP1 ORDER BY ID DESC)
AS TEMP2 ORDER BY ID ASC

この文は、まず最初の15のレコードをクエリーし、その後、逆順クエリーの前の5つのレコード(すなわち、逆数の5つのレコード)をクエリーし、この時点で11~15のレコードを取得しましたが、彼らの順序は逆順序なので、最後に昇順ソートを行います.
次に3つ目の書き方を見て、MAX(ID)関数を採用します.
--MIN()   MAX()     
--
id > (PageIndex-1)*PageSize id AND id <= PageIndex*PageSize id
SELECT TOP 5 * FROM LeaveWordView WHERE ID>
(SELECT MAX(ID) FROM(SELECT TOP 10 ID FROM LeaveWordView ORDER BY ID) AS TEMP1) --( 10 id)

この理解も簡単で、まず10番目のレコードのidを探し出して(もちろんこの中はMAX()を直接使って検索して、MIN()関数の使い方も似ています)、それから10番目のレコードのidより大きい上位5つのレコードを比較して私たちに必要な結果です.
OK、私たちは上記の3つのページ検索文を理解した後、私は最後の1つを見て、私自身が推薦して使う1つで、ROWを使いますNUMBER.OracleにはROWIDがあることを覚えています.これにより、クエリーがより便利になります.IDフィールドが連続していないことに憂鬱になることが多く、簡単で効率的なSQL文クエリーが複雑になります.SQL Server 2005が出てきたとき、似たような機能が実現しました.それはROWです.NUMBER,ROW_NUMBERの後ろにOVER(ORDER BY[FIELD])が付いていなければならないので、具体的な書き方を見てみましょう.
--   (ROW_NUMBER)  ,         ,   SQL Server2005        
--
SELECT ROW_NUMBER() OVER(ORDER BY ID) AS ROWID FROM LeaveWordView
SELECT * FROM(
SELECT TOP 15 ROW_NUMBER() OVER(ORDER BY ID ASC) AS ROWID,*
FROM LeaveWordView) AS TEMP1
WHERE ROWID>10

ここで注意しなければならないのは、OVERのカッコに複数のソートフィールドを書くことです.例えば、OVER(ORDER BY CreatedTime、ID)です.この文は、最初の15のレコードをクエリーし、ROWID=10以降のレコードを取り出します.
以上は4でよく使われるページングクエリ文ですが、実際には、彼らの効率は万レベルでデータを見ると、効率の差は大きくありませんが、百万以上のデータを処理する際に、最後の方法を選択することは間違いありません.本文の1つの目的はページングクエリーを検討することであり、もう1つはSELECT文のいくつかの書き方を共有することである.
最後に卵を割るのを歓迎します・・・
  
 
読んでくれてありがとう.ご意見や疑問を残してください.能力が限られていて、間違いは避けられないので、ご指摘を歓迎します.
分割線:私の個人オリジナル、承認してくださいhttp://freedong.cnblogs.com/(原文の出所を表示しないのは恥ずかしい)