簡體   English   中英

數據庫分頁設計

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM