1. 程式人生 > >SQL Server Cardinality Estimation 簡介

SQL Server Cardinality Estimation 簡介

CE簡介
CE 是用來估計查詢結果返回的記錄數的,優化引擎會使用它來生成最優的執行計劃。如果新版的CE導致你的查詢執行速度更慢,通常是由於以下的原因:

  • 查詢語句在OLTP系統中執行的頻率非常高, 且經常會併發執行。
  • Select語句中使用大量的聚合條件,並且在OLTP系統的日常工作時間執行。

CE的歷史
1998 年,SQL Server 7.0中引入的CE的一次重大更新,相容級別是70, 當時的CE 模型是基於以下4個假設:

  • Independence獨立性: 不同列的資料分佈是相互獨立的, 除非有關聯資訊可用。
  • Uniformity均勻分佈性: 唯一值均勻分佈並且以同樣的頻率出現。
  • Containment (Simple) 封閉性?:使用者只查詢存在的資料。 比如,兩個表使用等於條件做JOIN,會先針對每個表各自的過濾條件預測各自的可選擇性,然後再預測JOIN結果的選擇性。
  • Inclusion包容性:針對類似於 WHERE COLUMN=Constant的過濾條件,CE會假定Constant是一個實際存在的值。

後續的更新從SQL Server 2014(12.x)開始,即相容級別120或更新。這次的內容更新了針對現代的資料倉庫和OLTP型別負載的一些假定和演算法。下面的模型假設從CE 120開始引入:

  • Independence 變成 Correlation: 不同列之間的值不一定是獨立的,這樣更貼近實際查詢場景。
  • Simple Containment 變成 Base Containment: 使用者可能會查詢不存在的資料。比如,兩個表使用等於條件做JOIN, 會先預測JOIN結果的選擇性,然後再考慮每個表的過濾條件。

如何觀測CE的提升?用下面的語句分別設定ON 和OFF, 觀測執行計劃中estimated row count的變化。

ALTER DATABASE SCOPED CONFIGURATION
SET LEGACY_CARDINALITY_ESTIMATION = ON;
GO

參考資料
https://docs.microsoft.com/en-us/sql/relational-databases/performance/cardinality-estimation-sql-server?view=sql-server-2017


https://blogs.msdn.microsoft.com/psssql/2015/06/16/identifying-sql-server-2014-new-cardinality-estimator-issues-and-service-pack-1-improvement/