Sql-Server

IDENTITY 列中的巨大空白

  • August 28, 2015

這個問題是關於 SQL Server 2008 R2 SP3 Standard Edition x64 中的奇怪行為。

我已經閱讀了許多關於 SQL Server 中的 IDENTITY 增量以及它們之間奇怪的差距的問題。但基本上人們說它與交易或重啟有關。就我而言(使用命名實例),差距簡直是巨大的。

應用程序在表中插入了 130 000 條記錄,並且發生“算術溢出 IDENTITY 轉換為 int”錯誤。我們截斷表,並批量插入 70 000 條記錄。在批量插入 IDENTITY 列期間,最大值高於 9 000 000!

由於它不是正常負載而是批量插入 - 在此操作期間沒有回滾、重新啟動或任何其他問題。

所以差距不是1000,而是幾十萬。

由於我不控制應用程式碼(它是從其他公司購買的商業軟體),我只是害怕作為此類數據庫的管理員我能做什麼?我必須每 6 個月截斷一次表嗎?實時監控ID欄?

差距不是1000,而是十分之一萬。有遇到類似問題的同學嗎?

正如您已經知道的那樣,身份值存在差距(由回滾事務、過度估計的預分配等引起)是非常正常的,儘管這種稀疏使用值是相當不尋常的,並表明有一些事情需要您注意(可能是不可避免的設計問題,您只需要計劃一下,或者需要修復的故障)。

*我要問的第一件事是您是否IDENTITY在批量插入中完全觸摸了該列?*如果您正在處理IDENTITY_INSERT ON或類似情況,並且導入的數據包含大量數據,那麼這就是問題的根源。另一件要檢查的事情是可能觸及表格的隱藏程序——當數據被添加到表格並做一些奇怪的事情時,你是否有任何觸發器可能被觸發?

否則,如果您可以在問題中提供更多細節以幫助他人:

  • 有問題的表的結構(以及同一批量過程涉及的任何其他表):列/鍵/索引定義和任何觸發器
  • 您用於批量插入的程式碼(TSQL、對 BCP 的呼叫、您使用的任何方法)
  • 數據樣本(如果敏感,可能會匿名)
  • 當您執行測試時,數據庫是否處於安靜狀態,或者它是否處於活動狀態,可能正在處理其他事務?
  • 間隙是否遵循任何正常模式,或者它們似乎是隨機的?

作為一種解決方法,您可能會考慮使用 aBIGINT列代替,但如果它被其他地方的外鍵引用,這可能是一項需要更改的大工作(並且如果該值不純粹是數據庫內部的,則需要考慮如果接觸它的程式碼可以處理超出 32 位限制的值)。

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