2008-09-22 2 views
4

웹 응용 프로그램에서 검색 결과는 정렬 가능한 표로 표시됩니다. 사용자는 임의의 열을 클릭하고 결과를 정렬 할 수 있습니다. 문제는 몇 번이고 사용자가 광범위한 검색을 수행하고 많은 데이터가 반환됩니다. 정렬 가능한 부분을 작동 시키려면 모든 결과가 필요하며 시간이 오래 걸립니다. 또는 한 번에 몇 가지 결과를 가져올 수 있지만 정렬 작업은 실제로 잘 수행되지 않습니다. 많은 양의 데이터가 포함될 수있는 정렬 가능한 테이블을 표시하는 가장 좋은 방법은 무엇입니까?데이터가 많은 정렬 가능한 표에 가장 적합한 방법


모든 조언에 감사드립니다. 나는 확실히 이것들을 지나갈 것이다.

정렬 가능한 표가있는 기존 Javascript 프레임 워크를 사용하고 있습니다. "많은"결과는 수백을 의미합니다. 문제는 사용자가 원격 사이트에 있기 때문에 데이터 센터에서 데이터를 보내고받을 때 네트워크 시간이 많이 지연된다는 것입니다. 데이터베이스 측에서 데이터를 정렬하고 한 번에 한 페이지 분량의 결과 만 보내면 좋습니다. 사용자가 일부 열 머리글을 클릭하면 또 다른 왕복 이동이 수행되며 이는 항상 3-4 초를 추가합니다.

글쎄, 그 네트워크 팀의 문제 :

+0

실행중인 데이터베이스 유형과 사용중인 웹 스택에 대한 세부 정보를 제공 할 수 있습니까? –

답변

3

데이터베이스 수준에서 정렬 페이징을 사용하는 것이 정답입니다. 쿼리가 1000 개의 행을 반환하지만 사용자 중 10 명만 표시하려는 경우 다른 990을 네트워크를 통해 보낼 필요가 없습니다.

다음은 mysql 예제입니다. 당신은 '사람'테이블에서 10 행, 21-30가 필요 말 :

 
SELECT * FROM people LIMIT 21, 10 
3

당신은 다시 데이터베이스 서버에서 페이징을 수행해야 할 수도 같아요. 예 : SQL 2005와 SQL 2008에는 페이징 기술이 있습니다. 당신이보고있는 시스템에 상관없이 페이징 옵션을 살펴 보는 것이 좋습니다.

0

서버에서 정렬 작업을 수행 할 수 있습니다. AJAX는 완전 새로 고침의 필요성을 없애지 만 지연이 여전히 남아 있습니다. 측면, 데이터베이스 정렬시 일반적으로 매우 빠릅니다.

0

이러한 상황에서 필자는 정렬을 위해 데이터베이스를 활용할뿐만 아니라 사용자 지정 페이징을 사용하여 필요한 특정 레코드 만 반환하는 SQL Server 측 기술을 사용했습니다.

처음에는 구현하기가 힘들지 만 나중에 성능이 훌륭합니다!

0

"많은 데이터"가 얼마나 큽니까? 수백 줄? 수천?

정렬은 JavaScript를 사용하여 간편하게 Mochikit Sortable Tables을 사용하여 수행 할 수 있습니다. 그러나 데이터를 정렬하는 데 오랜 시간이 걸리면 (대부분 2 ~ 2 개의 [또는 3 개의!]) 사용자에게 soming이 발생하고 페이지가 고정되지 않은 시각적 신호를주기를 원할 수 있습니다. 예를 들어, 화면에 라이트 박스를 엷게 표시하고 애니메이션이나 텍스트를 정렬 할 수 있습니다.

2

무엇 데이터베이스 당신이에 페이징을 할 수 있도록 ROW_NUMBER를 사용하여 위쪽으로 SQL 2005 거기에 좋은 페이징 옵션으로 사용하고있다 섬기는 사람. 이 좋은 제품을 찾았습니다. Christian Darie's blog

예 :이 절차는 카테고리의 제품을 페이지하는 데 사용됩니다. 원하는 페이지 번호와 페이지의 제품 수를 전달하십시오.

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 
관련 문제