質問

Web アプリケーションでは、検索結果が並べ替え可能なテーブルに表示されます。ユーザーは任意の列をクリックして結果を並べ替えることができます。場合によっては、ユーザーが広範な検索を実行し、大量のデータが返されることが問題になります。並べ替え可能な部分を機能させるには、おそらくすべての結果が必要ですが、それには長い時間がかかります。または、一度に取得できる結果はほとんどありませんが、並べ替えがうまく機能しません。大量のデータが含まれる可能性のある並べ替え可能なテーブルを表示するためのベスト プラクティスは何ですか?


すべてのアドバイスをありがとう。私はこれらを必ず検討します。

ソート可能なテーブルを持つ既存の Javascript フレームワークを使用しています。結果の「たくさん」とは、何百もの結果を意味します。問題は、ユーザーがリモート サイトにいて、データ センターからデータを送受信するネットワーク時間に多くの遅延が発生していることです。データベース側でデータを並べ替えて、一度に 1 ページ分の結果のみを送信するのは便利です。ただし、ユーザーが列ヘッダーをクリックすると、別の往復が行われ、常に 3 ~ 4 秒かかります。

まあ、それはネットワークチームの問題かもしれません:)

役に立ちましたか?

解決

データベース レベルでソート ページングを使用するのが正しい答えです。クエリが 1000 行を返しても、そのうちの 10 行だけをユーザーに表示する場合、残りの 990 行をネットワーク経由で送信する必要はありません。

これはmysqlの例です。「people」テーブルの 21 ~ 30 の 10 行が必要だとします。

SELECT * FROM people LIMIT 21, 10 

他のヒント

データベースサーバー上でページングバックを実行する必要があります。例えば。SQL 2005 と SQL 2008 にはページング技術があります。検討しているシステムに応じてページング オプションを検討することをお勧めします。

SQL 2005 以降には ROW_NUMBER を使用してサーバー上でページングを実行できる優れたページング オプションがあるため、どのデータベースを使用していますか。でこんな良いものを見つけました クリスチャン・ダリーのブログ

たとえば、この手順は、カテゴリ内の製品のページを作成するために使用されます。必要なページ番号とページ上の商品数などを渡すだけです。

CREATE PROCEDURE GetProductsInCategory
(@CategoryID INT,
@DescriptionLength INT,
@PageNumber INT,
@ProductsPerPage INT,
@HowManyProducts INT OUTPUT)
AS

-- declare a new TABLE variable
DECLARE @Products TABLE
(RowNumber INT,
 ProductID INT,
 Name VARCHAR(50),
 Description VARCHAR(5000),
 Price MONEY,
 Image1FileName VARCHAR(50),
 Image2FileName VARCHAR(50),
 OnDepartmentPromotion BIT,
 OnCatalogPromotion BIT)

-- populate the table variable with the complete list of products
INSERT INTO @Products
SELECT ROW_NUMBER() OVER (ORDER BY Product.ProductID),
       Product.ProductID, Name, 
       SUBSTRING(Description, 1, @DescriptionLength) + '...' AS Description,
       Price, Image1FileName, Image2FileName, OnDepartmentPromotion, OnCatalogPromotion
FROM Product INNER JOIN ProductCategory
  ON Product.ProductID = ProductCategory.ProductID
WHERE ProductCategory.CategoryID = @CategoryID

-- return the total number of products using an OUTPUT variable
SELECT @HowManyProducts = COUNT(ProductID) FROM @Products

-- extract the requested page of products
SELECT ProductID, Name, Description, Price, Image1FileName,
       Image2FileName, OnDepartmentPromotion, OnCatalogPromotion
FROM @Products
WHERE RowNumber > (@PageNumber - 1) * @ProductsPerPage
  AND RowNumber <= @PageNumber * @ProductsPerPage

サーバー上で並べ替えを行うこともできます。AJAX を使用すると完全な更新の必要がなくなりますが、それでも遅延が発生します。ちなみに、データベースは一般的にソートが非常に高速です。

このような状況に対して、私は SQL Server 側でデータベースを活用して並べ替えを行うだけでなく、カスタム ページングを使用して必要な特定のレコードのみを返す手法を採用しています。

最初は実装するのが少し面倒ですが、その後のパフォーマンスは驚くべきものになります。

データの「大量」とはどれくらいの大きさですか?何百行も?何千人?

並べ替えは JavaScript 経由で簡単に実行できます。 Mochikit ソート可能テーブル. 。ただし、データの並べ替えに長い時間がかかる場合 (おそらく 1 ~ 2 秒、または 3 秒!)、何らかの問題が発生しており、ページが単にフリーズしただけではないことをユーザーに視覚的に示すことができます。たとえば、画面に色を付けて (ライトボックスのように)、「並べ替え」アニメーションまたはテキストを表示します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top