Sql-Server

邏輯讀取與返回的記錄

  • March 26, 2018

我對大致遵循這種形式的大表有一個非常基本的查詢:

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)沒有相關數據的頁的邏輯讀取次數

  1. 每頁相關結果行數

而這兩個是由你的指標決定的。如果該表沒有相關索引,那麼您將不得不掃描每一頁,並且您將不得不閱讀大量完全或幾乎不相關的頁面。即使您的索引支持僅讀取包含相關行的頁面(大部分)的查詢計劃,如果這些行非常寬,那麼每頁可能不會有很多 (A,B) 對。

如果您在此表上的 (B,A) 上有一個索引,則 SQL 可以查找 B=1 的第一行並開始掃描行,直到它遇到 A>SysUtcDateTime() 的行。這只需要約 4 個邏輯 IO 即可到達第一頁,然後每個邏輯 IO 將產生約 700 個 (A,B) 對。

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