クエリの最適化とページングアルゴリズムプログラムは、大規模なデータベースである(IV)

fariqi DESCによってGETDATE())順序

やったTGongwen Oする@ INDEXTABLE O.gid = t.nidからO.gid、O.mid、O.title、O.fadanwei、O.fariqiを選択

t.idによるとt.id> @PageLowerBoundとt.id <順

終わり

NOCOUNTオフに設定

  テーブル変数 - SQL Serverの最新の技術を使用してストアドプロシージャ上記。このプロセスは非常に良いメモリのページングストアドプロシージャであることを指摘しておかなければ。もちろん、このプロセスでは、あなたはまた、一時テーブルを書かれている変数を見ることができます:TABLE #TEMPを作成します。しかし、明らかに、SQL Serverでは、一時テーブルは、高速役に立たないテーブル変数です。私は、このストアドプロシージャを使用し始めたときに、私は、ADOの本来の速度よりも優れた、非常に良い感じ。しかし、その後、私はこの方法よりもより良い方法を発見しました。

  :私は次のように読み込み、「m番目の物品にn番目の記録方法は、データテーブルから削除された」のインターネットエッセイを見ています

m番目のテーブルに記録されたパブリッシュ物品からn番目の記事の削除:
。SELECT TOP-N + M * 1
FROM公開
WHERE(NOT ID IN
    (N TOP SELECT-IDを1
     公開FROM))

キーワードのIDは、テーブルを公開します

  私は本当に非常によくそのアイデアの精神を持ち上げた、この記事を読んでいました。突然の記事を思い出したとき、私は、オフィスオートメーションシステム(ASP.NET + C#+ SQL Serverなど)のためにあった、後になるまで待って、私はこの文は、外観を変更された場合、これは非常に良いページングストアドプロシージャ可能性がありだと思います。だから私は、私が期待していなかった、記事全文を見つけるためにオンライン行ってきました記事を見つけることが、ページングストアドプロシージャによって書かれた記事を見つけるために、この声明によると、ストアドプロシージャは、現在より人気のページングストアドプロシージャではありませんでしたが、私は非常に申し訳ありませんストアドプロシージャに変換し、この段落の最初ではありません。

CREATE PROCEDURE pagination2

SQL文なしで文を並べ替え- @SQLのデータ型はnvarchar(4000)、
、@Page int型-ページ
@RecsPerPage int型は、 -あたりのレコード数受け
、@ID VARCHAR(255) -ソートする必要性固有のID番号
@Sort VARCHAR(255) -ソートフィールドとルール

AS

(4000)@Str NVARCHARを宣言

筋力= + CAST "TOPをSELECT '(@RecsPerPage AS VARCHAR(20))+' @ SET *(FROM

PRINT @Str

EXEC sp_executesqlを@Str
GO

  次のように実際には、上記の文を簡略化することができます。

* TOPページサイズを選択

表1 FROM

WHERE(ID NOT IN

(ページ番号の数をTOPページサイズを選択*

FROM表

ID BY ORDER))

ORDER BY ID

  このストアドプロシージャは、致命的な欠陥を持っている。しかし、それはそれは言葉NOT INを含んでいることです。私はそれをとして変換することができますが。

* TOPページサイズを選択

表1 FROM

WHEREない存在

(b.id = a.id(IDによってTABLE1順序から页大小*页数)*(上選択)B SELECT * FROM)

IDによるオーダー

  それはないでするのではなく、存在しているが、我々はすでに2の効率化に話をしている、実際には違いありませんし、あります。

  そうであっても、NOTこの方法のTOP INの組み合わせで番号にカーソルを使用するよりも高速です。

  保存処理の効率を保存しない存在しますが、SQL Serverの使用はTOPキーワードは非常に賢明な選択である。ないとが、究極の目標は、レコードの大規模なセットを回避するために、ページングを最適化することであり、我々はすでに以前のTOPの利点に言及しているので、TOPを介してデータの量の制御を達成することができます。

  ページングアルゴリズムでは、私たちのクエリの速度の二点に影響を与える重要な要因:TOPとNOT IN。TOPは、クエリの速度を向上させることができますが、ない私達の全体のページングアルゴリズムの速度を上げるために、私たちのスピードを遅くするクエリで、他の方法でそれを置き換えるために、NOT IN改革する必要があります。

  私たちは、ほぼすべてのフィールドが、我々はMAX(フィールド)または分(フィールド)でフィールド内の最大値または最小値を抽出することができることを知っているので、このフィールドが繰り返されていない場合は、最大これらの非繰り返しフィールドを利用することができます分又は流域ように、各ページの参照に別のページングアルゴリズム行います。ここでは、「<」SARGクエリフォームに沿って記号を、「>」演算子でこのミッションを完了するか、することができます。以下のような:

選択してトップ10 * TABLE1からID> 200

  次のようにページング方式があります:

*トップページサイズを選択

TABLE1から

どこのid>

(から)MAX(IDを選択します

Tとして(IDによってTABLE1順序からトップ((P -1)*ページサイズ)IDを選択)

IDによるオーダー

  繰り返し、だけでなく、列のサイズを区別することは容易ではない値を選択するとき、私たちはしばしば、主キーを選択してください。次の表では、著者が最初にそれぞれのソート列、抽出GID、fariqi、タイトルフィールド、として、(GIDが主キーではなく、クラスタ化インデックスである。)GIDのために、千万オフィスオートメーションシステムのデータテーブルを使用している示しています試験ページングスキーム:(ユニット3種類以上の、10,100,500,1000,1 100,000 250,000 500,000、例えば、実行速度:MS)

ページ
スキーム1
スキーム2
スキーム3

1
60
30
76

10
46
16
63

100
1076
720
130

500
540
12943
83

1000
17110
470
250

10000
24796
4500
140

000 100
38326
42283
1553

250 000
28140
128 720
2330

500 000
121 686
127 846
7168


  100ページ以降のページでコマンドを実行する際に表から、我々は、すべてが信頼できる3つのストアドプロシージャを参照することができ、速度が非常に良いです。しかし、第1の実施形態は、上記のタブページ1000年を実行した後、速度がドロップダウン。第2のプログラムが落ちて実行ページ10000開始後の速度よりも約です。第三の選択肢は常に勢いがまだ非常に適切である、重大な減少傾向となっていません。

  第三のページング方式を決定した後、我々は、次に、ストアドプロシージャを書くことができます。我々は、すべてのSQL Serverのストアドプロシージャは、プリコンパイルされたSQL文であることを知って、WEBページより効率の実現を通じた効率が高くなるようにSQL文を来ました。次のストアドプロシージャだけではなく、ページング方式を採用していますが、また、統計によると総ページ数がパラメータを来たかどうかを判断します。

- データ指定されたページを取得します。

PROCEDURE pagination3のCREATE

@tblNameのVARCHAR(255)、 - 表名

@strGetFields VARCHAR(1000)= '*'、 - 列に戻る必要があります

@fldNameのVARCHAR(255)= ''、 - フィールド名をソート

@PageSize int型= 10、 - ページサイズ

@PageIndex int型= 1、 - P

@doCountビット= 0、 - レコードの合計数は、ゼロ以外の値を返さ

@OrderTypeビット= 0、 - 降順で、非ゼロ値をソートの種類を設定

@strWhereのVARCHAR(1500)= '' - クエリ条件(注:追加しないでください)

として

主な声明 - @strSQL VARCHAR(5000)を宣言

宣言@strTmpのVARCHAR(110) - 一時変数

発注の種類 - @strOrder VARCHAR(400)を宣言


@doCount場合!= 0

ベギン

@strWhereもし!= ''

"合計として選択数(*)から@strSQL =を設定する[" + @tblName + "]ここで、"

"[+ @tblName + "]" からトータルとしてSELECT COUNT(*)" @strSQL =を設定

終わり

- 上記のコードは@doCountが渡さ場合に統計的凝集の実装に、ゼロではないことを意味します。次のコードはすべて@doCountが0であります

ベギン


@OrderType場合!= 0

ベギン

@strTmp = "<(選択分" に設定

"[+ @fldName + "] DESC" 順" @strOrder =を設定します

- @OrderTypeない0場合は、降順の実装に、文章が非常に重要です!

終わり

ベギン

"(最大の選択>" @strTmp =を設定

"[+ @fldName + "] ASC" 順" @strOrder =を設定します

終わり


@PageIndex = 1の場合

ベギン

@strWhereもし!= ''

@strSQLを設定=ここで、 "+ @strWhere + "" + @strOrder [ "+ @tblName +"]から+ STR(@PageSize)+" "+" "トップを選択"

@strSQLを設定= [ "+ @tblName +"]から+ STR(@PageSize)+ " "+" "トップを選択"" + @strOrder

- 上記のコードの実装上の最初のページならば、それは実行を高速化します

終わり

ベギン

- 次のコードは、実際にSQLコードを実行するために@strSQLを与えます

= "[から+ STR(@PageSize)+" "+" "トップを選択" @strSQLを設定

+ @tblName + "]ここで、[" + @fldName + "]" + @strTmp + "([" + @fldName + "])(SELECTからトップ" + STR((@ pageIndexパラメータ-1)* @がPageSize)+ "[" + @fldName + "]から[" + @tblName + "]" + @strOrder + ")tblTmp)として" + @strOrder


@strWhereもし!= ''

= "[から+ STR(@PageSize)+" "+" "トップを選択" @strSQLを設定

+ @tblName + "] [" + @fldName + "]" + @strTmp + "(["

+ @fldName + "])(上部から選択" "[" + + STR((@ pageIndexパラメータ-1)* @がPageSize)を

+ @fldName + "]から[" + @tblName + "]ここで、" + @strWhere + ""

+ @strOrder + ")tblTmpなど)と" + @strWhere + "" + @strOrder


記事ソース:http://www.diybl.com/course/7_databases/sql/msshl/2007614/52157_4.html

ます。https://www.cnblogs.com/200831856/articles/1381733.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33972649/article/details/93711304