Sql-Server
邏輯讀取與返回的記錄
我對大致遵循這種形式的大表有一個非常基本的查詢:
SELECT [Extent1].[A] AS [A], [Extent1].[B] AS [B] FROM [dbo].[SomeTable] AS [Extent1] WHERE ([Extent1].[A] <= (SysUtcDateTime())) AND (2 = [Extent1].[B])
此查詢花費 100% 的時間使用聚集索引。在不同的環境中,我觀察到了這些結果:
- DEV:391 行,12 次邏輯讀取
- QA:341502 行,6030 次邏輯讀取
- UAT:1273656 行,52536 次邏輯讀取
在我看來,這個查詢的效率與給定結果集的大小一樣有效。
邏輯讀取與查詢返回的數據量之間是否存在普遍接受的相關性?如果是這樣,是否可以肯定地說這些結果屬於性能良好的查詢的接受範圍?
> > 邏輯讀取與查詢返回的數據量之間是否存在普遍接受的相關性? > > >
缺少的部分是
1)沒有相關數據的頁的邏輯讀取次數
- 每頁相關結果行數
而這兩個是由你的指標決定的。如果該表沒有相關索引,那麼您將不得不掃描每一頁,並且您將不得不閱讀大量完全或幾乎不相關的頁面。即使您的索引支持僅讀取包含相關行的頁面(大部分)的查詢計劃,如果這些行非常寬,那麼每頁可能不會有很多 (A,B) 對。
如果您在此表上的 (B,A) 上有一個索引,則 SQL 可以查找 B=1 的第一行並開始掃描行,直到它遇到 A>SysUtcDateTime() 的行。這只需要約 4 個邏輯 IO 即可到達第一頁,然後每個邏輯 IO 將產生約 700 個 (A,B) 對。