在 Azure SQL 受控執行個體中使用記憶體內部技術最佳化效能
適用於:Azure SQL 受控執行個體
記憶體內部技術可讓您改善應用程式的效能,並可能降低 SQL 受控執行個體的成本。 記憶體內部 OLTP 可在 Azure SQL 受控執行個體的業務關鍵服務層級中使用。
何時使用記憶體內部技術
您可以藉由使用記憶體內部技術,來達成各種工作負載的效能改進:
- 交易式 (線上交易處理 (OLTP)),其中大多數要求會讀取或更新較小的資料集,例如建立/讀取/更新/刪除 (CRUD) 作業。
- 分析 (線上分析處理 (OLAP)),其中大多數查詢基於報告目的都有複雜的計算,並且會定期排程執行負載 (或大量載入) 作業和/或將資料變更寫入現有資料表的流程。 OLAP 工作負載通常會從 OLTP 工作負載定期更新。
- 混合式 (混合式交易/分析處理 (HTAP)),其中會在相同資料集上執行 OLTP 和 OLAP 查詢。
記憶體內部技術可以藉由保留應該處理到記憶體的資料、使用查詢的原生編譯,或進階處理 (例如基礎硬體上可用的批次處理和 SIMD 指令),來改善這些工作負載的效能。
概觀
Azure SQL 受控執行個體支援下列記憶體內部技術:
- 記憶體內部 OLTP 會增加每秒的交易數目,並減少交易處理的延遲。 受益於記憶體內部 OLTP 的案例包括:高輸送量的交易處理 (例如交易和遊戲)、來自事件或 IoT 裝置的資料擷取、快取、資料載入,以及暫存資料表和資料表變數案例。
- 叢集資料行存放區索引可減少儲存體磁碟使用量 (最多 10 倍) 並提升報告和分析查詢的效能。 您可以將它與資料超市中的事實資料表搭配使用,以在資料庫中容納更多資料並改善效能。 此外,您可以將它與操作資料庫中的歷程記錄資料搭配使用以實現封存,並能夠查詢多達 10 倍的資料。
- HTAP 的非叢集資料行存放區索引可協助您透過直接查詢操作資料庫來即時深入解析業務,而不需要執行昂貴的擷取、轉換和載入 (ETL) 程序並等候資料倉儲填入。 非叢集資料行存放區索引允許在 OLTP 資料庫上快速執行分析查詢,同時降低對作業工作負載的影響。
- HTAP 的記憶體最佳化叢集資料行存放區索引可讓您執行快速交易處理,並同時對相同資料快速執行分析查詢。
資料行存放區索引和記憶體內部 OLTP 分別於 2012 年和 2014 年被引入到 SQL Server 中。 Azure SQL 資料庫、Azure SQL 受控執行個體和 SQL Server 共用記憶體內部技術的相同實作。
注意
如需詳細的逐步教學課程,使用 AdventureWorksLT
範例資料庫和 ostress.exe 示範記憶體內部 OLTP 技術的效能優勢,請參閱 Azure SQL 受控執行個體中的記憶體內部樣本 (部分機器翻譯)。
記憶體內部技術的優點
由於查詢和交易處理更有效率,記憶體內部技術也能協助您降低成本。 一旦進入 Azure SQL 受控執行個體業務關鍵服務層級,通常不需要升級 SQL 受控執行個體以實現效能提升。 在某些情況下,您甚至可以降低定價層,同時仍會看到記憶體內部技術的效能改進。
本文說明 Azure SQL 受控執行個體特有的記憶體內部 OLTP 和資料行存放區索引層面,也包含範例:
- 您會看到這些技術對儲存體和資料大小限制的影響。
- 您將了解如何管理不同定價層之間使用這些技術的資料庫移動。
- 您會看到兩個範例,分別示範如何使用記憶體內部 OLTP 以及資料行存放區索引。
如需 SQL Server 中記憶體內部 OLTP 的詳細資訊,請參閱:
- 記憶體內部 OLTP 概觀和使用方式情節 (包括客戶案例研究參考和入門資訊)
- 記憶體內部 OLTP 的文件
- 資料行存放區索引指南
- 混合式交易/分析處理 (HTAP),也稱為即時作業分析
記憶體內部 OLTP
記憶體內部 OLTP 技術藉由將所有資料保留在記憶體中,提供極快速的資料存取作業。 它也會使用特製化索引、查詢的原生編譯,以及無閂鎖資料存取,來改善 OLTP 工作負載的效能。 有兩種方式可以組織記憶體內部 OLTP 資料:
記憶體最佳化的資料列存放區格式,其中每個資料列都是個別的記憶體物件。 這是針對高效能 OLTP 工作負載最佳化的傳統記憶體內部 OLTP 格式。 可以按記憶體最佳化資料列存放區格式使用兩種類型的經記憶體最佳化的資料表:
- 持久性資料表 (SCHEMA_AND_DATA),其中在伺服器重新開機後會保留放置於記憶體中的資料列。 這種類型的資料表的行為類似於具有記憶體內部最佳化之額外優點的傳統資料列存放區資料表。
- 非持久性資料表 (SCHEMA_ONLY),其中的資料列在重新開機後不會保留。 這種類型的資料表適用於暫時性資料 (例如,取代暫存資料表),或您需要先快速載入資料再將其移至某些持久性資料表的資料表 (因此稱為「暫存資料表」)。
記憶體最佳化資料行存放區格式,其中的資料會以單欄式格式組織。 此結構適用於 HTAP 案例,其中,您必須在執行 OLTP 工作負載的相同資料結構上執行分析查詢。
注意
記憶體內部 OLTP 技術是針對可完全位於記憶體中的資料結構所設計。 由於記憶體內部資料無法卸載至磁碟,請確定您使用的 SQL 受控執行個體具有足夠的記憶體。 如需詳細資訊,請參閱記憶體內部 OLTP 的資料大小和儲存體上限。
- 記憶體內部 OLTP 快速入門:快速入門 1:可加快 T-SQL 效能的記憶體內部 OLTP 技術。
記憶體內部 OLTP 的資料大小和儲存體上限
記憶體內部 OLTP 包括經記憶體最佳化的資料表,該資料表用於儲存使用者資料。 這些資料表必須納入記憶體中。 這個想法被稱為記憶體內部 OLTP 儲存體。
業務關鍵服務層級包含一定數量的記憶體內部 OLTP 記憶體上限,這是虛擬核心數目決定的限制。
下列項目計入記憶體內部 OLTP 儲存體上限:
- 經記憶體最佳化的資料表中的作用中使用者資料列和資料表變數。 舊的資料列版本不會計入上限。
- 經記憶體最佳化的資料表上的索引。
- ALTER TABLE 作業的作業額外負荷。
如果您達到上限,您會收到配額不足的錯誤,且無法再插入或更新資料。 若要緩和此錯誤,請刪除資料或增加資料庫或集區的定價層。
如需監視記憶體內部 OLTP 儲存體使用率和設定即將達到上限的警示的詳細資料,請參閱監視記憶體內部儲存體。
變更硬體設定或虛擬核心計數
降低硬體設定或虛擬核心計數可能會對您的 SQL 受控執行個體造成負面影響。
經記憶體最佳化的資料表中的資料必須符合硬體設定和虛擬核心計數的記憶體內部 OLTP 儲存空間限制。 如果嘗試縮小到沒有足夠可用記憶體內部 OLTP 儲存空間的設定,則操作會失敗。
判斷記憶體內部物件是否存在
有一種程式設計方式可了解 SQL 受控執行個體中的指定資料庫是否支援記憶體內部 OLTP。 您可以執行下列 Transact-SQL 查詢:
SELECT DatabasePropertyEx(DB_NAME(), 'IsXTPSupported');
如果查詢傳回 1
,則此資料庫中支援記憶體內部 OLTP。
下列查詢將使用記憶體內部技術識別所有物件:
SELECT * FROM sys.tables WHERE is_memory_optimized=1
SELECT * FROM sys.table_types WHERE is_memory_optimized=1
SELECT * FROM sys.sql_modules WHERE uses_native_compilation=1
記憶體內部資料行存放區
記憶體內部資料行存放區技術可讓您在資料表中儲存和查詢大量資料。 資料行存放區技術使用以資料行為基礎的資料儲存體格式和批次查詢處理,相較於傳統的資料列導向儲存體,最多可在您的 OLAP 工作負載中達到 10 倍的查詢效能改善。 相較於未壓縮的資料大小,您也可以將資料壓縮提升高達 10 倍。
有兩種類型的資料行存放區模型可用來組織資料:
- 叢集資料行存放區,以單欄式格式組織資料表中所有資料。 在此模型中,資料表中的所有資料列都會以單欄式格式放置,該格式會高度壓縮資料,並可讓您在資料表上執行快速分析查詢和報表。 視資料的性質而定,您的資料大小可能會減少 10-100 倍。 叢集式資料行存放區模型也可讓您快速擷取大量資料 (大量載入),因為大於 10 萬個資料列的大型批次會先壓縮,再儲存到磁碟。 此模型是傳統資料倉儲案例的不錯選擇。
- 非叢集資料行存放區,其中資料會儲存在傳統資料列存放區資料表中,而且資料行存放區格式中有用於分析查詢的索引。 此模型可啟用混合式交易分析處理 (HTAP):能夠在交易式工作負載上執行高效能的即時分析。 OLTP 查詢會在資料列存放區資料表上執行,該資料表已針對存取一小組資料列進行最佳化,而 OLAP 查詢則會在資料行存放區索引上執行,該索引比較適合用於掃描和分析。 查詢最佳化工具會根據查詢動態選擇資料列存放區或資料行存放區格式。 非叢集式資料行存放區索引不會減少資料的大小,因為原始資料集會保留在原始資料列存放區資料表中,而不會有任何變更。 不過,其他資料行存放區索引的大小應該比對等 B 型樹狀結構索引的大小小一個數量級。
注意
記憶體內部資料行存放區技術只會保留記憶體中處理所需的資料,而無法納入記憶體中的資料則會儲存在磁碟上。 因此,記憶體內部資料行存放區結構中的資料量可能會超過可用記憶體數量。
資料行存放區索引的資料大小和儲存體
資料行存放區索引不需要納入記憶體中。 因此,索引大小的唯一上限是資料庫整體大小上限。 如需詳細資訊,請參閱 Azure SQL 受控執行個體資源限制 \(部分機器翻譯\)。 Azure SQL 受控執行個體支援所有層級的資料行存放區索引。
當您使用叢集資料行存放區索引時,會針對基底資料表存儲體使用單欄式壓縮。 此壓縮可大幅減少使用者資料的儲存體磁碟使用量,這表示您可以在資料庫中容納更多資料。 使用單欄式封存壓縮可以進一步增加壓縮。 您可以達成的壓縮量取決於資料的本質,但 10 倍的壓縮並不罕見。
例如,如果您的資料庫大小上限為 1 TB,而且使用資料行存放區索引達到了 10 倍壓縮,則資料庫中總共可以容納 10 TB 的使用者資料。
當您使用非叢集資料行存放區索引時,基底資料表仍會以傳統的資料列存放區格式儲存。 因此,儲存體節省不如叢集資料行存放區索引那麼顯著。 不過,如果您要以單一資料行存放區索引取代多個傳統的非叢集索引,則仍然可以在資料表的儲存體磁碟使用量中看到整體節省。