共用方式為


使用 Azure SQL 資料庫中的記憶體內部技術將效能最佳化

適用於: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 資料庫中的記憶體內部範例 (部分機器翻譯)。

記憶體內部技術的優點

由於查詢和交易處理更有效率,記憶體內部技術也能協助您降低成本。 您通常不需要升級資料庫的定價層,便可達到效能提升。 在某些情況下,您甚至可以降低定價層,同時仍會看到記憶體內部技術的效能改進。

透過使用記憶體內部 OLTP,仲裁商務解決方案能夠將其工作負載加倍,同時將 DTU 改善 70%。 如需詳細資訊,請參閱 Azure SQL 資料庫中的記憶體內部 OLTP

注意

進階版和業務關鍵層級 Azure SQL 資料庫提供記憶體內部技術。

本文說明 Azure SQL 資料庫特有的記憶體內部 OLTP 和資料行存放區索引層面,也包含範例:

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

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

記憶體內部 OLTP

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

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

    • 持久性資料表 (SCHEMA_AND_DATA),其中在伺服器重新開機後會保留放置於記憶體中的資料列。 這種類型的資料表的行為類似於具有記憶體內部最佳化之額外優點的傳統資料列存放區資料表。
    • 非持久性資料表 (SCHEMA_ONLY),其中的資料列在重新開機後不會保留。 這種類型的資料表適用於暫時性資料 (例如,取代暫存資料表),或您需要先快速載入資料再將其移至某些持久性資料表的資料表 (因此稱為「暫存資料表」)。
  • 記憶體最佳化資料行存放區格式,其中的資料會以單欄式格式組織。 此結構適用於 HTAP 案例,其中,您必須在執行 OLTP 工作負載的相同資料結構上執行分析查詢。

注意

記憶體內部 OLTP 技術是針對可完全位於記憶體中的資料結構所設計。 由於記憶體內部資料無法卸載至磁碟,請確定您使用的資料庫具有足夠的記憶體。 如需詳細資料,請參閱記憶體內部 OLTP 的資料大小和儲存體上限

記憶體內部 OLTP 的資料大小和儲存體上限

記憶體內部 OLTP 包括經記憶體最佳化的資料表,該資料表用於儲存使用者資料。 這些資料表必須納入記憶體中。 由於您會直接在 SQL Database 中管理記憶體,因此我們有使用者資料配額的概念。 這個想法被稱為記憶體內部 OLTP 儲存體

每個支援的單一資料庫定價層和每個彈性集區定價層都包含一定數量的記憶體內部 OLTP 儲存體。

下列項目計入記憶體內部 OLTP 儲存體上限:

  • 經記憶體最佳化的資料表中的作用中使用者資料列和資料表變數。 舊的資料列版本不會計入上限。
  • 經記憶體最佳化的資料表上的索引。
  • ALTER TABLE 作業的作業額外負荷。

如果您達到上限,您會收到配額不足的錯誤,且無法再插入或更新資料。 若要緩和此錯誤,請刪除資料或增加資料庫或集區的定價層。

如需監視記憶體內部 OLTP 儲存體使用率和設定即將達到上限的警示的詳細資料,請參閱監視記憶體內部儲存體

關於彈性集區

使用彈性集區時,記憶體內部 OLTP 儲存體會與集區中的所有資料庫共用。 因此,一個資料庫中的使用方式可能會影響其他資料庫。 此問題的兩個風險降低措施如下:

  • 針對低於整個集區之 eDTU 或虛擬核心計數的資料庫,設定 Max-eDTUMaxvCore。 此上限會將集區中任何資料庫中記憶體內部 OLTP 儲存體使用率上限,設為對應至 eDTU 計數的大小。
  • 設定大於 0 的 Min-eDTUMinvCore。 此下限保證集區中的每個資料庫都有對應至所設定 Min-eDTUvCore 的可用記憶體內部 OLTP 儲存體數量。

變更使用記憶體內部 OLTP 技術之資料庫的服務層級

您隨時可將資料庫升級至較高層級,例如從一般用途 (vCore) 升級至業務關鍵,或標準 (DTU) 升級至進階版。 可用的功能和資源只會增加。

但降級層級可能會對您的資料庫造成負面影響。 從業務關鍵降級至一般用途 (或進階版降級至標準或基本),且資料庫包含記憶體內部 OLTP 物件時,影響尤其明顯。 您可以輕鬆地在資料庫尋找記憶體內部物件

降級之後無法使用經記憶體最佳化的資料表 (即使它們仍保持可見)。 當您降低彈性集區的定價層,或將具有記憶體內部技術的資料庫移至一般用途、標準或基本彈性集區時,適用相同的考量。

重要

Azure SQL 資料庫一般用途、標準或基本 DTU 層級不支援記憶體內部 OLTP。 因此,無法將具有任何記憶體內部 OLTP 物件的資料庫移至這其中一層。 將資料庫降級之前,請先移除所有經記憶體最佳化的資料表和資料表類型,以及所有原生編譯的 T-SQL 模組,或是將它們轉換為資料列型物件。

相應減少業務關鍵層中的資源:經記憶體最佳化的資料表中的資料,大小必須適用於與資料庫分層相關聯的記憶體內部 OLTP 儲存體,或是在彈性集區可供使用。 如果您嘗試相應減少階層,或將資料庫移至沒有足夠可用記憶體內部 OLTP 儲存體的集區,則作業會失敗。

判斷記憶體內部物件是否存在

有一種程式設計方式可了解,指定的資料庫是否支援記憶體內部 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 倍。 叢集資料行存放區模型也可讓您快速擷取大量資料 (大量載入),因為大於 100,000 個資料列的大型批次會在儲存到磁碟之前進行壓縮。 此模型是傳統資料倉儲案例的不錯選擇。
  • 非叢集資料行存放區,其中資料會儲存在傳統資料列存放區資料表中,而且資料行存放區格式中有用於分析查詢的索引。 此模型可啟用混合式交易分析處理 (HTAP):能夠在交易式工作負載上執行高效能的即時分析。 OLTP 查詢會在資料列存放區資料表上執行,該資料表已針對存取一小組資料列進行最佳化,而 OLAP 查詢則會在資料行存放區索引上執行,該索引比較適合用於掃描和分析。 查詢最佳化工具會根據查詢動態選擇資料列存放區或資料行存放區格式。 非叢集資料行存放區索引不會減少資料的大小,因為原始資料集會保留在原始資料列存放區資料表中,而不會有任何變更。 不過,其他資料行存放區索引的大小應該比對等 B 型樹狀結構索引的大小小一個數量級。

注意

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

資料行存放區索引的資料大小和儲存體

資料行存放區索引不需要納入記憶體中。 因此,索引大小的唯一上限是整體資料庫大小上限,記載於以 DTU 為基礎的購買模型以虛擬核心為基礎的購買模型文章中。

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

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

當您使用非叢集資料行存放區索引時,基底資料表仍會以傳統的資料列存放區格式儲存。 因此,儲存體節省不如叢集資料行存放區索引那麼顯著。 不過,如果您要以單一資料行存放區索引取代許多傳統的非叢集索引,則仍可發現資料表的儲存體磁碟使用量整體更為節省。

變更包含資料行存放區索引的資料庫服務層級

如果您的目標層級低於 S3,則可能無法將單一資料庫降級至基本層或標準層。 僅在業務關鍵/進階版定價層和標準層、S3 及以上層級支援資料行存放區索引,在基本層不支援該索引。 當您將資料庫降級至不支援的層級或等級時,資料行存放區索引會變成無法使用。 系統會維護資料行存放區索引,但絕不會使用該索引。 如果您稍後升級回支援的層級或等級,資料行存放區索引會立即準備好供再次使用。

如果您有叢集資料行存放區索引,整個資料表會在降級之後變成無法使用。 將資料庫降級至不支援的層級或等級之前,請先卸除所有叢集資料行存放區索引 (並以資料列存放區叢集索引取代)。