Sql-Server-2017

連接中使用的列的列類型分析

  • March 25, 2020

是否可以對原始碼庫、視圖和儲存過程進行深入的類型分析,以辨識不具有兼容類型的列的連接?

我繼承了一個在使用 varchar 與 nvarchar 列方面不一致的數據庫。有時數字列與包含數字的文本欄位連接。現在有一些更改會在數據庫中的某些表中帶來更多數據,例如數千萬條記錄,並且連接類型中的任何差異都會對性能產生巨大影響。這些表具有 varchar 欄位,無法將它們更改為 nvarchar(它們由不支持 nvarchar 的第三方產品填充)。

我有的選擇:

  1. 將所有 varchar 列轉換為 nvarchar。不幸的是,這是不可能的。那將是我的首選。1.b 將所有 nvarchar 列轉換為 varchar。嗯…我覺得這是一個我可能不想進入的兔子洞,儘管所有的文本數據都應該是英文的。
  2. 使用 MS Transact SQL 解析器 ( DacFx ) 來分析查詢,但是,我覺得這將需要一些重大的程式工作。我需要所有 sql server 函式及其返回類型的完整列表。

還有其他想法嗎?

謝謝

是否可以對原始碼庫、視圖和儲存過程進行深入的類型分析,以辨識不具有兼容類型的列的連接?

這很可能是可能的,但我想推荐一種不同的方法。

…並且連接類型中的任何差異都會對性能產生巨大影響。

與其試圖全面修復所有這些不匹配,我會嘗試找出那些能給你帶來“最大收益”的問題。使用SQL Server First Responder Kitsp_BlitzCache中的儲存過程。你可以像這樣執行它:

EXEC sp_BlitzCache @DatabaseName = N'YourDatabaseName';

預設情況下,這將為您提供來自該數據庫的 10 個 CPU 最密集的查詢。

在輸出中,有一個“警告”列,您應該能夠通過查找“隱式轉換”找到具有這些不匹配謂詞和連接列的查詢:

警告列輸出的螢幕截圖

對於有該警告的行,您可以滾動到“隱式轉換資訊”列以獲取詳細資訊,從“查詢計劃”列中獲取執行計劃,或者僅使用“查詢文本”列將您引導到正確的位置.

我的主要觀點是,一些不匹配的數據類型可能不會導致任何真正的問題。如果伺服器由於特定表中的少數特定列而著火,您不想浪費時間修復這些問題。

引用自:https://dba.stackexchange.com/questions/262627