Sql-Server

哪個更有效,過濾 SSRS 數據集或使用查詢參數過濾

  • December 15, 2017

我組織中的人員在 SSRS 報告中使用 SQL 查詢:例如

SELECT name, age 
FROM egTable

然後,此查詢在數據庫上執行,然後他們使用 SSRS 中的 FILTER 刪除不需要的行。例如,SSRS 中有一個名為 AGE 的過濾器,它類似於Age = 11

我的建議是,這很糟糕:這種做事方式意味著我們正在查詢整個表,然後從 GIANT 結果集中我們只是擺脫了不需要的行。相反,我們應該引入一個參數:@age,然後編寫如下查詢:

   SELECT name, age 
   FROM egTable
   WHERE age = @age

我說第一種方法拉整個表是否正確,而我的方法效率更高,因為它只返回一個小的結果集?

我如何驗證/證明這一點?

TL / 博士

ExecutionLog是的,您是正確的,您可以通過在 SSRS 數據庫中顯示結果來證明這一點。

更長的答案

我基於 Adventureworks 數據庫創建了 2 份相同的報告,一份在數據集上為 City 設置了過濾器,一份在查詢中為 City 設置了參數。

報告 1

此報告的查詢是:

SELECT  Person.Address.*
FROM    Person.Address

過濾器是這樣添加的:

在此處輸入圖像描述

該報告的結果是:

在此處輸入圖像描述

報告 2

此報告的查詢是

SELECT  Person.Address.*
FROM    Person.Address WHERE city=@city

此數據集上沒有過濾器

在此處輸入圖像描述

該報告的結果是:

在此處輸入圖像描述

在哪裡可以看到相同的數據,但行為不同,因為使用者必須為過濾器輸入一個值(標記為黃色)

如果這是不希望的,可以通過向參數添加預設值並將可見性設置為隱藏來克服,如下所示:

在此處輸入圖像描述

和這個:

在此處輸入圖像描述

效率證明

兩種報告的效率都可以通過查詢執行日誌表和視圖來證明,如下所示:

SELECT [ItemPath], [Parameters], [TimeDataRetrieval], [TimeProcessing], [TimeRendering], [RowCount] 
FROM ExecutionLog3;

這 2 份報告返回:

+--------------------------+--------------+-------------------+----------------+---------------+----------+
|         ItemPath         |  Parameters  | TimeDataRetrieval | TimeProcessing | TimeRendering | RowCount |
+--------------------------+--------------+-------------------+----------------+---------------+----------+
| /Report Project3/Report1 | NULL         |               669 |           1878 |           880 |    19614 |
| /Report Project3/Report2 | city=Bothell |                 8 |             42 |             4 |       26 |
+--------------------------+--------------+-------------------+----------------+---------------+----------+

因此,第二種方法不僅獲取的行數要少得多(26 對 19614),而且處理和呈現報告的時間也更少。

引用自:https://dba.stackexchange.com/questions/96698