2012-01-31 92 views
2

我有一個管理記錄級權限的視圖。爲此,我們將其稱爲「AuthorityView」。它通過查看底層表,實際的「數據」,「記錄權限」表和「用戶組」表來工作。改善視圖的性能

對於本示例,我們選擇「員工」記錄。有一個核心表,「EmployeeData」包含所有數據,「EmployeeRecordAuthority」指定哪些用戶組具有對數據的訪問權限(讀取,讀取,更新,刪除等)和「用戶組」只需存儲用戶所屬的組。

該視圖使用了一個相當簡單的連接,但處理了大量記錄(〜10萬條員工記錄和〜3條記錄規範記錄)。最終結果是用戶可以查看的記錄的子集。

我遇到的問題是查詢沒有標準的視圖是非常緩慢的。大約需要6-7分鐘做一個「從EmployeeAuthorityView中選擇」,然而,應用一個「頂部」使其按預期執行。 「從EmployeeAuthorityView選擇頂部10000000 *」只需幾秒鐘。

表之間存在所有相關索引,並且已被重建。

什麼可能導致查詢速度減慢?爲什麼使用指定的「頂部」限制進行查詢更快?即使數量遠遠大於表中的記錄數量?

在此先感謝。

+0

這是Oracle,MySQL,SQL Server還是其他RDBMS? – 2012-01-31 03:27:53

回答

0

性能差異可能是由於數據庫查詢優化器用於檢索數據的不同策略。

確切的原因取決於您正在使用哪個DBMS以及如何編寫查詢優化器,但問題來自「無標準視圖」的概念,並且類似於以下內容。

您的EmployeeAuthorityView看起來像是Data,RecordAuthority和UserGroups表的聯接。因此,沒有任何過濾標準的視圖本身定義了一個理論集合,它是這些表格的產品(外連接)。該理論集包含100,000 x 3,000,000 x U記錄(U是您的UserGroups表的大小)。只要應用了一些選擇標準,理論集合的大小就會大大降低,但沒有標準,它就有數萬億條記錄(假設您的UserGroups表有3行以上)。

DBMS需要實例化這個理論集合的多少條記錄,然後才能給你一個緩衝區滿?查詢優化器考慮多種策略,包括(策略A)在將第一個緩衝區全部返回給您的應用程序之前創建所有300萬億條記錄(策略B)只是在需要時創建記錄,一旦它將緩衝區全部返回到您的應用程序有那麼多。影響這一選擇的因素包括「按照什麼順序將記錄返回到您的應用程序」。使用「top」限制會導致訂單的定義不同,在這種情況下,它會選擇類似於策略B的內容。