精品国产一级在线观看,国产成人综合久久精品亚洲,免费一级欧美大片在线观看

SQL Server 2016改進了查詢優化器

責任編輯:editor004

作者:Jonathan Allen

2016-06-08 12:07:41

摘自:INFOQ

SQL Server的前兩個版本主要是通過提供新特性提高性能,而SQL Server 2016主要是改進本身已有的功能。一件受兼容性級別控制的事情是使用哪個查詢優化器和基數估計器。

SQL Server的前兩個版本主要是通過提供新特性提高性能,而SQL Server 2016主要是改進本身已有的功能。

基數估計器

基數估計器是所有查詢優化器的核心。它會查看被查詢表的統計信息以及執行的操作,估計查詢執行計劃每一步的行數。有經驗的DBA都知道,錯誤的基數估計會嚴重降低數據庫的性能。可能導致的問題包括:

選擇了錯誤的索引; 選擇了錯誤的連接運算符(例如嵌套循環、哈希和合并); 分配的內存過多,妨礙了其他查詢; 分配的內存過少,導致過多數據溢出到tempdb。

考慮到基數估計器如此重要,你可能會驚訝,SQL Server 2012使用的基數估計器基本上與1998年SQL Server 7引入的基數估計器相同。僅僅是兩年之前,我們才看到了“SQL Server查詢優化器基數估計過程的第一次大規模重新設計”。要想深入了解那個版本,可以閱讀白皮書《使用SQL Server 2014基數估計器優化查詢計劃》。

SQL Server 2016就是以那項工作為基礎構建的,當兼容性級別設置為130時,可以提供更準確的估計。不過,也可能出現退化,因此,在生產環境中更改兼容性級別之前,要對現有的數據庫進行徹底地測試。

兼容性級別

你可能不熟悉這個術語,兼容性級別在SQL Server中有兩個關鍵的作用。首先,可以確定哪些數據庫特性可用。將數據庫設置到一個比較低的兼容性級別上,就會無法使用一些較新的特性。通常,這不會帶來升級問題,因為數據庫的設計考慮了較老的特性集。

另外一件受兼容性級別控制的事情是使用哪個查詢優化器和基數估計器。在經過精心調優的數據庫中,為了降低性能退化的可能性,你可以選擇一個較低的兼容性級別,強制SQL Server使用使用一個來自舊版本的查詢優化器。

在某些情況下,你需要更細粒度的控制。例如,SQL Server 2016允許你將兼容性級別設為130,以使用所有的新特性,但仍然使用舊版本的基數估計器。這可以通過下面的命令設置:

ALTER DATABASE SCOPED CONFIGURATIONSET LEGACY_CARDINALITY_ESTIMATION = ON;

除了SQL Server 2008 R2之外,每個版本的兼容性級別都比上一個版本大10。所以SQL Server 2000的兼容性級別為80,而SQL Server 2016為130。每個SQL Server版本都至少支持前面的兩個版本。

多線程插入

在SQL Server 2016之前,Insert-Select語句只在選擇階段是多線程的,而實際的插入操作是序列化的。現在,插入操作也可以是“多線程的或者可以有并行計劃”。

內存優化表

內存優化表也具備了多線程的能力。

統計

SQL Server 2016在統計方面有兩個變化。第一個是在使用大表時更新頻率更高了。

以前,當發生變化的行數達到20%時才會觸發統計信息的自動更新,這對于大表來說是不合適的。從SQL Server 2016(兼容性級別130)開始,該閾值會與表的行數關聯起來——表的行數越多,觸發統計信息更新的閾值就越低。注意,在以前的版本中,該行為由Trace Flag 2371控制。

例如,如果一個表有10億行,在以前的行為模式下,只有當發生變化的行數達到2億時才會啟動自動統計更新。在SQL Server 2016中,只需要100萬行就可以觸發自動統計更新。

繼續討論并行化。現在,當使用兼容性級別130時,統計信息可以“由一個多線程的進程抽樣收集”。

外鍵約束

關系型數據庫的一大賣點是能夠將一個表和其他的表關聯,并使用外鍵約束確保數據一致性。但那有一些開銷,因此,在SQL Server 2014及更早的版本中,表的外鍵約束上限為253。

你可能會覺得這個數很大了,但在一個大型數據庫中,當你開始考慮包含審計列時,如“CreatedByKey”,就很容易達到那個限制了。為了緩解這個問題,微軟將傳入外鍵約束的上限增加到了10000。就是說,你可以有數千個表同時引用某一個用戶表。但有一些注意事項。

首先,這不適用于傳出外鍵約束,也不適用于自引用表。這些情況的外鍵上限仍然是200多個。

其次,被引用的表不能使用MERGE操作修改;只允許進行DELETE和UPDATE操作。(理論上,SELECT和INSERT操作也是允許的,但文檔中并沒有提到它們,因為它們不受傳入外鍵約束的影響。)

注:“關系型數據庫管理系統”中的“關系”一詞實際上并不是指表之間的關系。更確切地說,它是一個數據科學術語,是指行里的每個值和同一行里的其他所有值的關系。在數據透視表中,每個單元格都是一個獨立的和或平均值,它是一個非關系型表的例子。

連接和外鍵約束

前面已經講過,外鍵約束是有成本的。如果你修改一個被外鍵約束潛在引用的行,那么數據庫就需要進行檢查,以確保沒有違反約束。

在SQL Server 2014中,執行檢查時會連接每個引用上述表的表。不難想象,開銷很快就會變得非常大。為了解決這個問題,SQL Server引入了一個新的“參照完整性運算器(Referential Integrity Operator)”。

新的查詢執行運算器會就地執行參照完整性檢查,比較修改的行和引用表里的行,以驗證修改是否會破壞參照完整性。這會極大地減少此類計劃的編譯時間及相應的執行時間。

查看英文原文:Query Optimizer Improvements in SQL Server 2016

鏈接已復制,快去分享吧

企業網版權所有?2010-2024 京ICP備09108050號-6京公網安備 11010502049343號

  • <menuitem id="jw4sk"></menuitem>

    1. <form id="jw4sk"><tbody id="jw4sk"><dfn id="jw4sk"></dfn></tbody></form>
      主站蜘蛛池模板: 宽城| 瑞安市| 巧家县| 高青县| 永康市| 曲阳县| 利川市| 涞源县| 浠水县| 镇原县| 金平| 玉田县| 西盟| 宾阳县| 安达市| 呼图壁县| 周至县| 当阳市| 宁晋县| 宁阳县| 西乌珠穆沁旗| 新津县| 浮梁县| 谢通门县| 英德市| 平罗县| 临城县| 石林| 洛南县| 黔西| 九江县| 仲巴县| 泸水县| 丹寨县| 塔城市| 凤阳县| 濮阳县| 外汇| 安丘市| 舞钢市| 新巴尔虎右旗|