使用擴充套件事件捕獲隱式轉換

2021-08-29 18:22:25 字數 1684 閱讀 1758

使用適當的資料型別以避免轉換或隱式轉換是良好的t-sql編碼實踐的基本方法。隱式轉換可能導致較差的效能。。但是,除了檢視系統中的每個執行計畫之外,是否有一種方法可以檢視您是否正在經歷隱式轉換?事實上,是的,它就在那裡的延伸事件。

嵌入到擴充套件事件中的是乙個捕獲將影響執行計畫的轉換的事件。此事件將同時顯示轉換和轉換_隱式警告,這些警告通常只會在執行計畫中看到。您可以與其他人一起捕捉此事件。通過捕獲事件以及因果關係跟蹤,可以很容易地跟蹤有此問題的查詢。下面是乙個例子,說明如何捕獲隱式轉換以及查詢:

create event session implicitconversion
on server
add event sqlserver.plan_affecting_convert
(where (sqlserver.database_name = n'adventureworks2017')),
add event sqlserver.sql_batch_completed
(where (sqlserver.database_name = n'adventureworks2017')),
add event sqlserver.sql_batch_starting
(where (sqlserver.database_name = n'adventureworks2017'))
add target package0.event_file
(set filename = n'c:\perfdata\implicitconversion.xel')
with (track_causality = on);
這組事件將捕獲批處理的開始和批處理的完成,以及plan_impact_convert事件。因為我將track_因果關係設定為on,所以可以確保將隱式轉換與特定的查詢關聯起來。您可以輕鬆地修改它以處理語句或遠端過程呼叫。

另一種方法是只捕獲plan_impact_transform事件。然後使用操作(也稱為全域性字段)來獲取查詢。本課程將完成以下工作:

create event session implicitconversiononly
on server
add event sqlserver.plan_affecting_convert
(action (sqlserver.sql_text)
where (sqlserver.equal_i_sql_unicode_string(sqlserver.database_name, n'adventureworks2017')))
add target package0.event_file
(set filename = n'c:\perfdata\implicitconversiononly.xel');
如果操作被過度使用,則可能會出現問題。此外,有些操作比其他操作的開銷更大。但是,在這種情況下,它可能比新增因果關係跟蹤的負載更小。

您可能仍然有在這些查詢中包含轉換或轉換_隱式的查詢,這些查詢不會被此事件捕獲。這是因為並非所有這樣的轉換都會導致計畫中的問題。您可能還會看到錯誤的結果,在這種情況下,優化器會發出不影響效能的轉換警告。

正如您所看到的,通過擴充套件事件來處理哪些查詢可能會因為隱式轉換而遇到問題,實際上是非常容易的。實際上,您只能通過擴充套件事件捕獲此資訊。這種能力只是我強烈推薦使用擴充套件事件的另乙個原因。

隱式轉換中隱式引數與隱式函式的使用

隱式引數的使用 要定義多個隱式引數時,需要使用柯里化函式。隱式轉換作用就是 當呼叫方法時,不必手動傳入方法中的隱式引數,scala會自動在作用域範圍內尋找隱式值自動傳入。1 同型別的引數的隱式值只能在作用域內出現一次,同乙個作用域內不能定義多個型別一樣的隱式值。2 implicit 關鍵字必須放在隱...

scala 隱式轉換函式 隱式轉換引數

目前的scala相關部落格大概只能算乙個筆記,方便自己記錄,也幫大家查詢資訊了。首先scala中的隱式轉換可以分為隱式函式轉換與隱式引數轉換兩類,下面就來分別說一下自己對這兩種模式的理解。1 隱式函式轉換,我們先看一段 scala val x int 3.14 10 error type misma...

隱式轉換和隱式引數

1 隱式轉換 隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別 object scala01 implicit def f1 d double int double 是輸入型別,int 是轉換後的型別 隱式函式的底層工作原理 def...