OLE DB Provider 的散發統計資料需求
為了改進分散式查詢的最佳化,SQL Server 2005 定義了 OLE DB 規格的擴充功能,OLE DB 提供者可以使用這些功能來報告所公開之資料列集或資料表的散發統計資料。雖然這些擴充功能是定義在 SQL Server 文件集中,但若個別的 OLE DB 提供者開發人員希望此項資訊可為 SQL Server 使用,則必須在提供者中撰寫支援擴充功能的程式碼。若提供者包含支援擴充功能的程式碼,SQL Server 就可以使用擴充功能來最佳化分散式查詢的效能。若提供者不支援擴充功能,SQL Server 則會使用散發統計資料的簡單估計值。
附註: |
---|
Microsoft SQL Native Client OLE DB Provider 與 Microsoft OLE DB Provider for Oracle 都支援散發統計資料。 |
散發統計資料擴充功能是針對稱為統計資料的單位而建立。每個資料表都可有零個或多個統計資料,而每個統計資料則報告一個或多個資料行的資料。統計資料會記錄下列項目:
- 統計資料所涵蓋的每個資料行中值的基數或唯一值的數目。
- 統計資料所涵蓋的所有資料行的連結數值基數。
- (選擇性) 長條圖可報告統計資料所涵蓋之第一個資料行內的索引鍵值之不同範圍相關資訊。報告的數值可包含每個索引鍵範圍的資料列個數、每個索引鍵範圍內的唯一數值個數、或是在資料表中索引鍵值小於或等於範圍內最大索引鍵值的資料列個數。
以下為一個資料表範例。
ColumnA | ColumnB |
---|---|
'abc' |
'xyz' |
'abc' |
'xyz' |
'def' |
'xyz' |
'mno' |
'xyz' |
'mno' |
'mmm' |
'tuv' |
'xyz' |
對於涵蓋 ColumnA 與 ColumnB 的統計資料,兩個資料行結合起來的值之基數是 5。也就是說,ColumnA 與 ColumnB 的值有 5 種獨特的組合,原因是前兩個資料列有相同的組合值 ('abc' + 'xyz')。
只算 ColumnA 時的基數為 4,而 ColumnB 的基數則為 2。將會報告一個關於 ColumnA 的簡單、四階長條圖。
數值範圍 | 範圍內的資料表資料列的百分比 |
---|---|
'aaa' 到 'hzz' |
50% |
'iaa' 到 'nzz' |
33% |
'oaa' 到 'rzz' |
00% |
'taa' 到 'zzz' |
17% |
不同的 OLE DB 資料來源記錄不同資料行組合的散發統計資料,並且 OLE DB 提供者所報告的一組統計資料將被實作定義。例如,SQL Server 6.5 版和較早的版本只會為索引所涵蓋的資料行建立散發統計資料,並且對於資料表中定義的每個索引有一個統計資料。SQL Server 7.0 版和更新的版本則會建立下列統計資料:
- 定義於資料表的每個索引都有一個統計資料。
- 每個 CREATE STATISTIC 陳述式都有一個統計資料。
- 自動產生的每個統計資料都有一個統計資料。
若資料行可能針對述詞引數中指定的特定數值傳回較少的資料列,則該資料行具有較高的選擇性。散發統計資料可用來估計選擇性程度:
- 具有高基數的資料行將擁有較多的資料數值,並且每個資料數值所符合的資料列數比較可能比具有較低基數的資料行所符合的資料列數少。
- 若 OLE DB 提供者提供了一個長條圖來報告值在資料行中的分佈情形,SQL Server 最佳化工具也會估計述詞引數中的特定值是落在具有較佳或較差選擇性的範圍內。
擁有連結伺服器的較佳分佈統計資料也有助於最佳化器針對分散式查詢的區域部份建立有效的執行計畫 (Execution Plan)。
SQL Server 最佳化工具會嘗試使用散發統計資料,減少必須在 OLE DB 提供者與 SQL Server 之間通訊的資料量。例如,若在本機伺服器的 TableA 與連結伺服器的 TableB 之間執行分散式聯結,則 SQL Server 可以使用散發統計資料來決定這些程序中哪一個最有效率:
- 將 TableA 內符合非聯結述詞的資料列傳送到連結伺服器,並讓連結伺服器執行該聯結。
- 將 TableB 內符合非聯結述詞的資料列擷取到本機伺服器,並在本機伺服器上執行聯結。
若 OLE DB 提供者並未報告有關資料行的基數資訊,SQL Server 最佳化工具會估計一個較低的基數。若提供者並未報告統計資料的分散長條圖,最佳化器的運作方式就好像數值平均分散於資料表的資料列一樣。
SQL Server 會使用 OLE DB 提供者的下列擴充功能來報告散發統計資料:
- 資料來源屬性 DBPROP_TABLESTATISTICS 會指出提供者是否報告散發統計資料。
- IDBSchemaRowset TABLE_STATISTICS 會列出特定基底資料表可用的統計資料。包含資料行及資料列基數。
- IOpenRowset::OpenRowset 會接受用來識別統計資料的引數。若指定了統計資料,OpenRowset 就會傳回長條圖資料列集,顯示 StatisticID 所指定統計資料所涵蓋的第一個資料行中,值的分佈情形。
這些 OLE DB 擴充功能包含在 OLE DB 2.6 版或更新版本中。如需這些散發統計資料擴充功能的相關資訊,請參閱 OLE DB 2.6 規格。
OLE DB 提供者可選擇實作取樣基本資料表之部份資料列的效能增強,以決定散發統計資料與長條圖。這些提供者應該算出它們的基數與長條圖資料,以便在將它們報告於 TABLE_STATISTICS 與長條圖資料列集之前反映出資料表的總數。
OLE DB 提供者是否會將 TABLE_STATISTICS 及長條圖資料列集中的資料和基底資料表目前的內容保持同步,會由實作定義。