2013-07-18 51 views
0

我有2個選擇查詢。第一個執行網格分頁選擇(每頁25行)(using TOP @pagesize*@pagenum EXCEPT TOP @pagesize*(@pagenum-1) construction)。第二個查詢總計行數。Transact SQL查詢性能建議

那麼,WITH AS構建會提高性能與兩個分離的查詢,如果是的話,爲什麼?請注意,該查詢包含多個列,INNER JOIN和WHERE條件。

回答

1
  1. 帶零件本身並不有助於性能。它使查詢更易於理解。
  2. 如果我理解正確,計數是針對所有行的。如果您將所有行都傳送到客戶端,則可以保存第二個呼叫,但在大多數情況下,它會更加昂貴。
  3. 使用頂部X只獲取最後一個X/Y行是個壞主意。您應該添加一個自動編號並選擇自動編號在所需範圍內的行。

    SELECT ROW_NUMBER()OVER(ORDER BY [某件事] DESC)FROM ... WHERE [ROWNUMBER] 10和20之間

0

另外,如果使用ORDER BY ...偏移,而非TOP ... ORDER BY您可以使用COUNT(*)OVER()獲取所有行,而不管分頁。否則,您必須使用WITH(像你一樣)來隔離數據並獲得與第2臺的尋呼以及其他任何東西(行號,頁碼,總頁數等

例無偏移:

DECLARE @page INT = 1, @rows INT = 5 

    ;WITH data AS (SELECT * FROM mytable where id = 454545) --possible filters 

      ,rows ([page], [pages], [rows]) AS 
      (
      SELECT @page, CEILING(CAST(COUNT(*) AS float)/@rows), COUNT(*) FROM data 
     ) 
      SELECT TOP (@rows) * 
      FROM (SELECT row_number() OVER (ORDER BY data.id) rowNumber, * FROM rows, data) pagination 
      WHERE rowNumber > (@page - 1) * @rows 
      order by rowNumber 

例與偏移:

DECLARE @page INT = 1, @rows INT = 5 

    SELECT 
    row_number() OVER (order by id) rowNumber,@page Page,(CEILING(CasT(COUNT(*) OVER() as float)/@rows)) Pages, 
    COUNT(*) OVER() Rows, * 

    from mytable where id = 454545 --possible filters 
    order by rowNumber 
    OFFset (@page-1)*@rows rows 
    FETCH NEXT @rows rows ONLY 

在這兩種情況下,確保ORDER BY是絕對的其他分頁不能保證