3

このクエリは、非常に長い動的な Sequel ストアド プロシージャから生成されます。このプロシージャは、Telerik Radgrid に表示される特定のインデックスから始まる要求された数のレコードを返し、ページングを効果的に処理します。ストアド プロシージャの出力の簡略版:

SELECT r.* FROM (
       SELECT ROW_NUMBER() OVER(ORDER BY InventoryId DESC) as row,
       v.* FROM vInventorySearch v
       ) as R WHERE [ROW] BETWEEN 1 AND 10

"BETWEEN" 句が 1 から 10 の間の場合は、ほんの一瞬で実行されますが、10000 から 1010 の間の場合は、実行にほぼ 1 分かかります。

ここで何か基本的なことが欠けているように感じますが、どの 10 件のレコードを取得するかは問題ではなく、同じ時間がかかるはずです。

ご意見ありがとうございます。恥ずかしい思いをするのを楽しみにしています!


解決策、厚意によるMartin Smith (以下):

SELECT r.*, inv.* FROM 
(
    SELECT ROW_NUMBER() OVER(ORDER BY InventoryId DESC) as row, v.InventoryID
    FROM vInventorySearch v
    WHERE 1=1 
) as R 
inner join vInventory inv on r.InventoryID = inv.InventoryID
WHERE [ROW] BETWEEN 10001 AND 10010

ご協力いただきありがとうございます!

4

2 に答える 2

4

ROW_NUMBER行番号が大きい場合、ページ分割は実際にはかなり非効率的です。

場合によっては、それを少しROW_NUMBER分割して、狭いインデックスに対してクエリを実行し、一致する PK を取得してベース テーブルに結合し、欠落している列を取得する方がよい場合があります。

于 2012-11-02T20:04:52.127 に答える
1

SQL2012にはより効率的なページングメカニズムがあります

http://stevestedman.com/2012/04/tsql-2012-offset-and-fetch/

DepartmentID、Revenue、YearをREVENUE ORDER BY Year、DepartmentID ASC OFFSET 10 ROWS FETCH NEXT10ROWSのみから選択します。

于 2012-11-02T21:04:42.380 に答える