在 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 共用記憶體內部技術的相同實作。

注意

如需詳細的逐步教學課程,以示範記憶體內部 OLTP 技術的效能優勢,使用AdventureWorksLT範例資料庫和ostress.exe,請參閱記憶體內部範例 Azure SQL 受控執行個體

記憶體內部技術的優點

由於查詢和事務處理更有效率,記憶體內部技術也協助您降低成本。 一旦進入 Azure SQL 受控執行個體 業務關鍵 服務層級,您通常不需要升級 SQL 受控實例以達到效能提升。 在某些情況下,您甚至可以減少定價層,同時仍會看到記憶體內部技術的效能改善。

本文說明記憶體內部 OLTP 和數據行存放區索引的層面,這些索引是 Azure SQL 受控執行個體 特有的,也包含範例:

  • 您會看到這些技術對記憶體和數據大小限制的影響。
  • 您將瞭解如何管理在不同定價層之間使用這些技術的資料庫移動。
  • 您會看到兩個範例,說明如何使用記憶體內部 OLTP,以及資料行存放區索引。

如需 SQL Server 中記憶體內部 OLTP 的詳細資訊,請參閱:

記憶體內部 OLTP

記憶體內部 OLTP 技術藉由將所有數據保留在記憶體中,提供極快速的數據存取作業。 它也會使用特製化索引、查詢的原生編譯,以及無閂鎖的數據存取,以改善OLTP工作負載的效能。 有兩種方式可組織記憶體內部 OLTP 數據:

  • 記憶體優化的數據列存放區 格式,其中每個數據列都是個別的記憶體物件。 這是針對高效能 OLTP 工作負載優化的傳統記憶體內部 OLTP 格式。 記憶體優化資料表有兩種類型可用於記憶體優化數據列存放區格式:

    • 長期數據表 (SCHEMA_AND_DATA)會在伺服器重新啟動後保留放置於記憶體中的數據列。 這種類型的數據表的行為就像傳統數據列存放區數據表,具有記憶體內部優化的額外優點。
    • 無法還原的數據表 (SCHEMA_ONLY),其中數據列在重新啟動後不會保留。 這種類型的數據表是針對暫存數據而設計的(例如,取代臨時表),或您需要先快速載入數據的數據表,再將其移至某些保存數據表(稱為臨時表)。
  • 記憶體優化的數據行存放 區格式,其中數據會以單欄格式組織。 此結構是針對 HTAP 案例所設計,您必須在 OLTP 工作負載執行所在的相同數據結構上執行分析查詢。

注意

記憶體內部 OLTP 技術是針對可完全位於記憶體中的數據結構所設計。 由於記憶體內部數據無法卸除至磁碟,請確定您使用的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 倍。

有兩種類型的數據行存放區模型可用來組織數據:

  • 以單欄格式組織數據表中所有數據的叢集數據行存放區。 在此模型中,數據表中的所有數據列都會以單欄格式放置,可高度壓縮數據,並可讓您在數據表上執行快速分析查詢和報表。 視數據的性質而定,您的數據大小可能會減少 10x-100x。 叢集數據行存放區模型也可讓您快速擷取大量數據(大量載入),因為大於100,000個數據列的大型批次會在儲存在磁碟上之前壓縮。 此模型是傳統數據倉儲案例的絕佳選擇。
  • 非叢集數據 行存放區,其中數據會儲存在傳統數據列存放區數據表中,而且數據行存放區格式中有索引用於分析查詢。 此模型可啟用混合式交易分析處理(HTAP):能夠在交易式工作負載上執行高效能的即時分析。 OLTP 查詢會在數據列存放區數據表上執行,該數據表已針對存取一小組數據列進行優化,而 OLAP 查詢則會在數據行存放區索引上執行,以較適合用於掃描和分析。 查詢優化器會根據查詢動態選擇數據列存放區或數據行存放區格式。 非叢集數據行存放區索引不會減少數據的大小,因為原始數據集會保留在原始數據列存放區數據表中,而不會有任何變更。 不過,其他數據行存放區索引的大小應該小於對等 B 型樹狀結構索引的大小。

注意

記憶體內部數據行存放區技術只會保留記憶體中處理所需的數據,而無法放入記憶體中的數據會儲存在磁碟上。 因此,記憶體內部數據行存放區結構中的數據量可能會超過可用的記憶體數量。

數據行存放區索引的數據大小和記憶體

數據行存放區索引不需要放入記憶體中。 因此,索引大小的唯一上限是整體資料庫大小上限。 如需詳細資訊,請參閱 Azure SQL 受控執行個體資源限制 \(部分機器翻譯\)。 Azure SQL 受控執行個體 支援所有數據層中的數據行存放區索引。

當您使用叢集數據行存放區索引時,會針對基表記憶體使用單欄式壓縮。 此壓縮可大幅減少用戶數據的記憶體使用量,這表示您可以在資料庫中容納更多數據。 使用單欄封存壓縮可以進一步增加 壓縮。 您可以達成的壓縮量取決於數據的本質,但壓縮的10倍並不罕見。

例如,如果您的資料庫大小上限為 1 TB(TB),而且使用資料行存放區索引達到壓縮的 10 倍,則資料庫中總共可以容納 10 TB 的用戶數據。

當您使用非叢集數據行存放區索引時,基表仍會以傳統的數據列存放區格式儲存。 因此,儲存空間節省不如叢集數據行存放區索引那麼重要。 不過,如果您要以單一資料行存放區索引取代許多傳統非叢集索引,您仍然可以在數據表的記憶體使用量中看到整體節省。