事件
3月31日 下午11時 - 4月2日 下午11時
最大的 SQL、網狀架構和 Power BI 學習事件。 3 月 31 日 - 4 月 2 日。 使用程式代碼 FABINSIDER 來節省 $400 美元。
立即註冊
適用於:SQL Server
SQL Server 移轉後步驟對於協調任何資料精確度和完整性,以及發現工作負載的效能問題至關重要。
以下是一些移轉至 SQL Server 平台後常發生的效能案例以及解決方法。 這些包含 SQL Server 至 SQL Server 移轉的特定案例 (舊版移轉至新版),以及外部平台 (例如 Oracle、DB2、MySQL 及 Sybase) 移轉至 SQL Server。
適用於:SQL Server 至 SQL Server 的移轉。
從舊版 SQL Server 移轉至 SQL Server 2014 (12.x) 或更新版本,並升級到最新的資料庫相容性層級時,工作負載可能會有效能迴歸的風險。
這是因為從 SQL Server 2014 (12.x) 開始,所有的查詢最佳化工具變更都會繫結至最新的資料庫相容性層級;因此,計劃不會在升級時立即變更,而是在使用者將 COMPATIBILITY_LEVEL
資料庫選項變更為最新版本時變更。 此功能會結合查詢存放區,可讓您在升級過程中對查詢效能擁有絕佳層級的控制。
如需 SQL Server 2014 (12.x) 所導入的查詢最佳化工具變更的詳細資訊,請參閱使用 SQL Server 2014 基數估算程式最佳化您的查詢計劃。
如需有關 CE 的詳細資訊,請參閱基數估計 (SQL Server)。
將資料庫相容性層級變更成來源版本並遵循建議的升級工作流程,如下圖所示:
如需本文的詳細資訊,請參閱在升級到新版 SQL Server 期間保持效能穩定。
適用於:外部平台 (例如 Oracle、DB2、MySQL 及 Sybase) 至 SQL Server 的移轉。
注意
針對 SQL Server 至 SQL Server 的移轉,若此問題存在於來源 SQL Server 中,依現況移轉至較新版本的 SQL Server 將無法處理此種狀況。
SQL Server 透過在第一次編譯時使用探查輸入參數來編譯預存程序的查詢計劃,產生已針對該輸入資料分佈進行最佳化的參數化和可重複使用的計畫。 即使不是預存程序,也會將產生簡單計劃的大部分陳述式進行參數化。 第一次快取計劃之後,日後的每次執行都會對應至先前快取的計劃。
第一次編譯時若未對一般工作負載使用最常見的參數集,就會引發潛在問題。 對於不同的參數,使用相同的執行計畫會變成效率不佳。 如需本文的詳細資訊,請參閱參數敏感度。
RECOMPILE
提示。 每次調整每個參數值時,計劃會計算一次。(OPTIMIZE FOR(<input parameter> = <value>))
選項。 決定要使用哪個適合大部分相關工作負載的值,建立和維護一個對於參數化值而言變得有效率的計劃。(OPTIMIZE FOR UNKNOWN)
選項。 其效果與使用區域變數技巧相同。DISABLE_PARAMETER_SNIFFING
提示。 除非使用 OPTION(RECOMPILE)
、WITH RECOMPILE
或 OPTIMIZE FOR <value>
,否則完全停用參數探查,其效果與使用區域變數技巧相同。提示
使用 Management Studio 計劃分析功能來快速確認這是否是問題。 如需詳細資訊,請參閱 SSMS 的新功能:查詢效能疑難排解變得更簡單!。
適用於:外部平台 (例如 Oracle、DB2、MySQL 及 Sybase) 和 SQL Server 至 SQL Server 的移轉。
索引不正確或遺漏會造成額外的 I/O,而導致額外的記憶體和 CPU 浪費。 這可能是因為工作負載設定檔已變更,例如使用不同的述詞,而使現有索引設計失效。 索引策略不佳或工作負載設定檔變更的辨識項包括:
適用於:外部平台 (例如 Oracle、DB2、MySQL 及 Sybase) 和 SQL Server 至 SQL Server 的移轉。
注意
針對 SQL Server 至 SQL Server 的移轉,若此問題存在於來源 SQL Server 中,依現況移轉至較新版本的 SQL Server 將無法處理此種狀況。
SQL Server 查詢最佳化工具只能說明編譯時已知的資訊。 如果工作負載依賴只有在執行時才能得知的述詞,則會提高選擇到不佳計畫的可能性。 在品質更高的計劃中,述詞必須是 SARGable 或 Search Argumentable。
非 SARGable 述詞的一些範例:
CONVERT_IMPLICIT
警告。 從某個類型轉換成另一個類型也可能造成致遺失有效位數。WHERE UnitPrice + 1 < 3.975
,但不是 WHERE UnitPrice < 320 * 200 * 32
。WHERE ABS(ProductID) = 771
或 WHERE UPPER(LastName) = 'Smith'
WHERE LastName LIKE '%Smith'
,但不是 WHERE LastName LIKE 'Smith%'
。一律將變數/參數宣告為預期的目標資料型別。
這可能涉及將資料庫所儲存的任何使用者定義程式碼建構 (例如預存程序、使用者定義函數或檢視表),與保存基礎表格所用資料類型相關資訊的系統資料表 (例如 sys.columns (Transact-SQL)) 進行比較。
如果無法周遊所有程式碼到上一個點,則基於相同目的,請變更資料表的資料類型以符合任何變數/參數宣告。
推斷出下列結構的效益:
注意
所有這些步驟皆可以程式設計方式完成。
適用於:外部平台 (例如 Oracle、DB2、MySQL 及 Sybase) 和 SQL Server 至 SQL Server 的移轉。
注意
針對 SQL Server 至 SQL Server 的移轉,若此問題存在於來源 SQL Server 中,依現況移轉至較新版本的 SQL Server 將無法處理此種狀況。
資料表值函數會傳回可以代替檢視的資料表資料類型。 檢視只限於單一 SELECT
陳述式,而使用者自訂函數可以包含其他陳述式,所允許的邏輯比在檢視中的還多。
重要
因為多重陳述式資料表值函式 (MSTVF) 的輸出資料表不會在編譯時建立,SQL Server 查詢最佳化工具會依賴啟發學習法,而不是實際的統計資料,來判斷資料列的估計值。 即使將索引加入基底資料表,也沒有什麼幫助。 針對 MSTVF,SQL Server 使用 1 的固定估計作為 MSTVF 預期傳回的資料列數目 (從 SQL Server 2014 (12.x) 開始,其固定估計為 100 個資料列)。
如果 MSTVF 僅為單一陳述式,請轉換為內嵌資料表值函式。
CREATE FUNCTION dbo.tfnGetRecentAddress(@ID int)
RETURNS @tblAddress TABLE
([Address] VARCHAR(60) NOT NULL)
AS
BEGIN
INSERT INTO @tblAddress ([Address])
SELECT TOP 1 [AddressLine1]
FROM [Person].[Address]
WHERE AddressID = @ID
ORDER BY [ModifiedDate] DESC
RETURN
END
內嵌格式範例會顯示在下方。
CREATE FUNCTION dbo.tfnGetRecentAddress_inline(@ID int)
RETURNS TABLE
AS
RETURN (
SELECT TOP 1 [AddressLine1] AS [Address]
FROM [Person].[Address]
WHERE AddressID = @ID
ORDER BY [ModifiedDate] DESC
)
如果更加複雜,請考慮使用記憶體最佳化資料表或暫存資料表所儲存的中繼結果。
事件
3月31日 下午11時 - 4月2日 下午11時
最大的 SQL、網狀架構和 Power BI 學習事件。 3 月 31 日 - 4 月 2 日。 使用程式代碼 FABINSIDER 來節省 $400 美元。
立即註冊訓練
學習路徑
Use advance techniques in canvas apps to perform custom updates and optimization - Training
Use advance techniques in canvas apps to perform custom updates and optimization
文件
SQL Server I/O 基本概念 - SQL Server
了解儲存體選擇和快取會如何影響 SQL Server 效能。
本指南說明所有 SQL Server 版本中用於管理分頁與範圍的資料結構。
選擇您感興趣的 SQL Server 移轉路徑。