簡體   English   中英

確定從日志中更新了多少行的方法

[英]Way to identify how many rows got updated from logs

我們處理來自上游系統的 CSV 文件,並將它們加載到 SQL 服務器數據庫中的主表中。 我們目前正在使用一個新的上游系統,突然我們的 UPDATE 語句花了很長時間。 這可能是由於傳入的數據在我們的系統中有以前的相關數據,並導致了巨大的更新。 我們能夠找到通過sp_whoisactive更新的表。

我的查詢是:

  • 發布更新,有沒有辦法從錯誤日志或默認跟蹤或通過 DMV 等某個地方計算表更新的行數?

  • 在更新過程中,如果我們發現將來會發生這種巨大的更新,我們是否可以設置一些跟蹤來確定將要更新的行數或找出具有當前參數(參數的當前值)的更新語句? sp_whoisactive ,我們得到帶有變量的更新語句。 但我們不知道當前的參數。

  • 我們是否應該主動設置擴展事件或其他東西來捕捉未來這些巨大的更新?

讓我們先從你的第三個問題開始。 是的。 如果您真的想跟蹤更改的特定值,最好的方法是通過擴展事件,您必須對其進行設置並提前運行。 正如您將在本文的 rest 中看到的那樣,可能沒有簡單的方法來檢索您正在尋找的特定信息,具體取決於。 像 sql_statement_completed 這樣的東西會給你一個給定事件的精確行數。 您可以將其過濾到特定表。

第二個問題,在更新期間,您無法真正看到在事務中准確更新了多少行。 但是,您可以猜測可能會更新多少行。 執行計划將具有預期會發生的行估計。 因此,您可以從 sys.dm_exec_query_plan 中查詢。 將其與 sys.dm_exec_sql_batch 結合以查找查詢。 我確信 sp_whoisactive 也可以提供此信息(它只是查詢 DMV)。 如果您提前正確設置了服務器,您還可以觀看實時查詢統計信息。 這將為您提供估計的行數,但隨后會顯示實際發生的行數。

現在是棘手的問題。 事后你能得到行數嗎? 有點兒。 如果查詢剛剛執行並且沒有再次執行,則 sys.dm_exec_sql_batch 確實有一個 last_rows 列來提供該信息。 但是,如果運行了多個查詢,則該信息會丟失,因為它只是最近一次執行的查詢。 如果您使用的是 Azure SQL 數據庫或 SQL Server 2019,您還可以查看 sys.dm_execution_plan_query sys.dm_exec 這也將有行數雖然,如果這就是您要尋找的全部,並且這是最近的執行,那么批處理 DMV 會更容易。 我不知道該列是否包含在 sp_whoisactive 中,但您可以自己查詢 DMV。

但是,如果查詢運行了不止一次,那么您就不走運了。 如前所述,您可以查看執行計划以查看行估計值。 如果查詢等待超過 30 秒,它將顯示在 system_health 擴展事件 session 中,但不包括行數。 真的,除非它是最后一次運行確切的查詢,否則在事后無法獲得行計數值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM