在這篇部落格中,我們分享了為什麼一些 Yugabyte 客戶選擇從 Microsoft SQL Server (MSSQL) 遷移到 YugabyteDB,提供快速入門指南(以便您可以 DIY),並詳細介紹頂級 YugabyteDB 效能調優技巧!
MSSQL 客戶試圖解決什麼問題?
客戶報告說,當您在早期 SQL Server 版本中插入具有順序遞增鍵的表時,所有新行都會新增到 B 樹末尾的同一頁中,直到該頁已滿。這會導致高並發下的爭用,這個問題在聚集索引和非聚集索引中都會出現。
如果您正在閱讀本文,您可能之前 荷蘭 電話號碼庫 已經研究過PAGELATCH_EX / PAGELATCH_SH等待。
假設您的 SQL Server 應用程式面臨類似的情況。如果您無法輕鬆升級並尋求 SQL Server 雜湊分割區策略的替代方案(及其限制和相關的應用程式變更),那麼將資料庫遷移到 YugabyteDB 是一個不錯的選擇。
為什麼選擇 YugabyteDB?
與傳統資料庫不同,YugabyteDB 旨在自動、透明地將資料分割到多個伺服器上。這確保了水平可擴展性和高可用性。
將傳統資料庫模式轉換為 YugabyteDB(PostgreSQL 語法)可以透過「直接遷移方法」來完成。但是,您可以對實體資料模型進行簡單、省力的最佳化,從而顯著提高效能。我稍後將在部落格中分享一個範例。
如何開始使用 YugabyteDB
DML/DDL 轉換
您可以使用 ORM 輕鬆地將 DML/DDL 從 transact-sql 轉換為 PostgreSQL 方言。但是,如果您不使用 ORM,則需要付出更多努力。 ChatGPT-4 和最近擅長 DDL/DML 轉換的 Claude 3.5 Sonnet 可以幫助您完成此任務 – 只要您正確提示即可。測試轉換後的查詢對於確保您仍然獲得正確的結果至關重要。這些工具可以幫助您完全轉換至少 80% 的查詢。
安裝yugabyted(如下詳述)
YugabyteDB 是完全開源的,但如果您的應用程式是關鍵任務並且需要額外的幫助並讓您高枕無憂,您也可以使用 YugabyteDB 完全託管的服務YugabyteDB Aeon 。
首先透過 docker 下載 yugabyted RF1 啟動並執行,以完成功能測試。當您準備好測試效能時,請切換到 Yugabyte Aeon。
為了在 yugabyted RF1 中盡可能匹配您的 SQL 伺服器,我建議使用這些設定啟動 YugabyteDB。複製並貼上此命令:
docker run -d –name yugabyte -p7001:7000 -p9000:9000 -p15433:15433 -p5433:5433 -p9042:9042 \
yugabytedb /yugabyte:2024.1.1.0-b137 bin/yugabyted 開始 \–tserver_flags= “yb_enable_read_comfilled_isolation=true,ysql_sequence_cache_method =伺服器,ysql_pg_conf_csv={yb_enable_optimizer_statistics=on,yb_enable_base_scans_cost_modelon}”
–背景=假
此命令為您提供基於成本的優化器、已提交讀取隔離等級以及快取在伺服器上而不是連接中的序列。
這可能是您在 SQL Server 中已經習慣的!
創建您的架構、連接您的應用程式、載入您的 meta 宣布 instagram 私訊的新功能,例如編輯文字或將聊天固定到頂部 資料、執行分析並完成您的功能測試。
請記住在加載資料後運行 ANALYZE!您需要使用基於成本的優化器進行一些統計,請留意即將推出的 YugabyteDB AUTO-ANALYZE。現在,安排每週一次分析,以保持最新的統計數據。
由於您要將資料庫遷移到其他供應商,因此最佳實踐是確保您的測試套件使用 PostgreSQL 語法在 YugabyteDB 上成功通過。之後,您可以開始大規模測試。我建議您在 Yugabyte Aeon 上測試擴充 YugabyteDB。
調音技巧! 您可以提升和行動應用程式的 80%,然後調整剩餘的 20%,以獲得出色的結果。
如何在 YugabyteDB 中進行微調
想像一下,在具有傳統 OrderLines 架構的 SQL 伺服器上執行電子商務網站。您最常見的查詢是尋找購物車或完成的購買。此查詢可能會返回三行,或者熱心的購物者可能會返回多達 30 行(或更多)。
SELECT * FROM OrderLines WHERE ol.OrderID = $ 1按ID訂購
讓我們回顧一個範例模式,看看如何在 YugabyteDB 中微調。同樣,您可以完全保留此庫存,不會有任何問題,因為 YugabyteDB 將對序列 ID 進行 哈希處理,並且不存在與 B 樹上的序列列相關的傳統問題。
創建表public.OrderLines (
您的設定可能是從傳統的訂單行模式演變而來的。您可以新增具有不同資料類型的新欄位。
在 YugabyteDB 中,雜湊函數將值指派給平板電腦。這樣,您就可以避免熱閂鎖問題。您的訂單行表可以線性縮放每秒查詢和總行數。每個表可以容納 PB 級的數據,您只需要足夠的 YugabyteDB 節點,一切都可以隨您擴展。
您可能沒有在 SQL Server 中的IndexOnlyScan上執行此查找,因為您需要向客戶端傳回太多欄位以取得覆蓋索引。
SELECT * FROM OrderLines WHERE OrderID = $ 1按ID訂購
在 YugabyteDB 中,我們可以對主鍵進行建模,以滿足對錶物件存取次數最多的查詢,該物件恰好是子表的父鍵。 (您可以將此技巧翻譯為子表的大多數父鍵。注意:大多數!)
主鍵,lsm(orderid HASH ,id ASC )
這樣的主鍵是什麼意思?
這意味著您最重要的選擇(讀取整個 OrderID)。您可以從多節點 YugabyteDB 部署中的一個節點取得整行。對於具有多個項目(行)的訂單,跨節點延遲被 台灣數據 最小化。另外,在 ID ASC 上排序意味著不會在計劃中引入任何排序。
最後,也是最好的部分。因為主鍵索引是表,所以這與IndexOnlyScan相同,而您先前在 SQL Server 中的兩項操作已減少為一項操作。
如果您需要保持不同訂單之間的 ID 唯一性,請新增唯一限制:顯式業務角色和底層唯一索引來偵測唯一性。
ALTER TABLE public.OrderLines新增約束uk_orderlines_id UNIQUE ( ID );
這一附加的唯一索引不會抵消主鍵更改,
因為我們現在減少了查找的一跳並消除了對錶對象的多個索引的需要。這意味著任何寫入操作都需要更少的寫入請求——總體而言,這是一個強勁的淨收益。
一個權衡是,純粹針對 ID 列的範圍查詢不再有效,但這通常不太可能是這裡的查詢。
您可以透過此主鍵變更刪除多個索引。您可能有更多,但以下是您可能擁有的主鍵現在可以提供的一些。YugabyteDB 可以將謂詞下推到遠端節點,以使用儲存過濾器(在 2024.1 及更高版本中從遠端過濾器重新命名)過濾未包含在索引(主鍵)條件中的列。
當您必須刪除大量行時,儲存過濾器不是一個好的操作。不過,當每個 OrderID 的平均行數很少時,儲存過濾器就很完美,而且所有這些附加索引都變得多餘。
所以,使用這個簡單的改變我們有
刪除了為任何在 OrderID 上具有相等性的查詢提供服務的多個索引
使用唯一 ID 保持 ID 的唯一性
透過主鍵存取表提供IndexOnlyScan
您不需要進行這些變更來提供線性可擴展性,但這些變更可以以更低的成本提供線性可擴展性。所有此類變更都會為您提供每個 CPU 每秒更多的查詢。
結論
這篇部落格介紹如何開始使用 YugabyteDB 並研究從 MSSQL 遷移的好處,以及共享資料建模技巧以最大限度地減少跨節點延遲。
如果您想跳過使用 yugabyted RF1 來完成功能測試,或者您已準備好測試效能但需要啟用或協助,請向我們的 YugabyteDB專家發送電子郵件並提供您的應用程式架構詳細資訊。該團隊可以為合格的應用程式授權免費的Yugabyte Aeon試用版。