4

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


すべてのアドバイスをありがとう。私は確かにこれらを調べます。

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

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

4

6 に答える 6

3

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

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

SELECT * FROM 人 LIMIT 21, 10 
于 2008-09-22T21:04:26.677 に答える
3

データベースサーバーでページングバックを行う必要があります。たとえば、SQL 2005 および SQL 2008 には、ページング手法があります。あなたが見ているシステムのページングオプションを調べることをお勧めします。

于 2008-09-22T20:54:54.343 に答える
2

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

例:カテゴリ内の製品をページングするために使用されるこの手順。必要なページ番号とページ上の製品数などを渡すだけです

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
于 2008-09-23T01:44:40.013 に答える
0

これらの状況では、ソートにデータベースを活用するだけでなく、カスタム ページングを使用して必要な特定のレコードのみを返すという手法を SQL Server 側で採用しています。

最初は実装するのが少し面倒ですが、その後のパフォーマンスは素晴らしいです!

于 2008-09-22T20:58:00.997 に答える
0

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

Mochikit Sortable Tablesを使用すると、JavaScript を介して簡単に並べ替えを行うことができます。ただし、データの並べ替えに時間がかかる場合 (ほとんどの場合、1 秒または 2 秒 [または 3 秒!]) は、何かが発生していて、ページがフリーズしただけではないという視覚的な合図をユーザーに提供することができます。たとえば、画面に色を付けて (ライトボックス風に)、「並べ替え」アニメーションまたはテキストを表示します。

于 2008-09-22T21:01:52.597 に答える
0

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

于 2008-09-22T20:56:06.930 に答える