Sql-Server
哪個更有效,過濾 SSRS 數據集或使用查詢參數過濾
我組織中的人員在 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),而且處理和呈現報告的時間也更少。