[英]database paging design
我正在像這樣為我的網格獲取數據
SELECT
Orders.CustomerID,
Orders.OrderTime,
OrderItems.ProductID,
OrderItems.Quantity
FROM
dbo.Orders INNER JOIN dbo.OrderItems
ON Orders.ID = OrderItems.OrderID
我還需要分頁的總數。
有兩種選擇。
1-進行另一次提取
SELECT count(*) FROM dbo.Orders
2-將count語句放入查詢中
SELECT
Orders.CustomerID,
Orders.OrderTime,
OrderItems.ProductID,
OrderItems.Quantity,
(SELECT count(*) FROM dbo.Orders) as Count
FROM
dbo.Orders INNER JOIN dbo.OrderItems
ON Orders.ID = OrderItems.OrderID
我應該走哪條路?
在您提出的2種方法中,第一種(單獨的查詢)更好。 第二種方法意味着計數將出現在返回的每一行中,這是不必要的。 另外,如果查詢返回20行,則select count(*)
將被執行20次(如果我沒記錯的話,猜測這可能取決於您所使用的數據庫引擎)。
此外,根據您設想的流量量和表可能獲得的大小,您可以通過將select count(*)
的結果緩存在某個地方,然后在插入/刪除表時刷新它來改善此情況。
如果這是用於SQL Server 2005或更高版本,則獲得分頁的最佳方法之一是使用Common Table Expression 。
CREATE PROC MyPaginatedDataProc
@pageNumber INT
AS
WITH OrdersCTE (CustomerID, OrderTime, ProductID, Quantity, RowNumber)
AS
(
SELECT
Orders.CustomerID,
Orders.OrderTime,
OrderItems.ProductID,
OrderItems.Quantity,
ROW_NUMBER() OVER (ORDER BY OrderItems.OrderID) AS RowNumber
FROM
dbo.Orders INNER JOIN dbo.OrderItems ON Orders.ID = OrderItems.OrderID
)
SELECT
CustomerID,
OrderTime,
ProductId,
Quantity
FROM
OrdersCTE
WHERE
RowNumber BETWEEN (@pageNumber * 10) AND (((@pageNumber + 1) * 10) -1)
否則,為了獲得總行數,我將使用一個單獨的查詢,如Mailslut所說。
如果使用的是oracle ,則可以使用COUNT(*) OVER ( ) CNT
。 此方法效率更高,因為它需要單表掃描
SELECT
Orders.CustomerID,
Orders.OrderTime,
OrderItems.ProductID,
OrderItems.Quantity,
COUNT(*) OVER ( ) CNT as Count
FROM
dbo.Orders INNER JOIN dbo.OrderItems
ON Orders.ID = OrderItems.OrderID
正如@Mailslut所建議的,您可能應該使用兩個查詢。 但是,您可能應該在查詢中添加WHERE
子句以獲取數據,因此僅獲取實際需要顯示的數據(除非您對其進行緩存)。
如果一次有多個線程正在訪問數據庫,則還需要以某種方式確保計數與數據庫保持同步。
我會考慮不同的事情,因為您要嘗試做的不是很簡單,而是非常必要的。 您是否考慮過使用SQL Server row_number函數? 這樣,通過查看返回的最大row_number以及您想要的順序,您將知道有多少條記錄。
SELECT
Orders.CustomerID,
Orders.OrderTime,
OrderItems.ProductID,
OrderItems.Quantity,
ROW_NUMBER() OVER(ORDER BY Orders.CustomerId) rn
FROM
dbo.Orders INNER JOIN dbo.OrderItems
ON Orders.ID = OrderItems.OrderID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.