我們有一個非常複雜的分析過程,其中包含多個變量和數千個記錄,這些記錄通常會在tempdb
中生成萬億個置換記錄。通過預處理和動態SQL,我們能夠在幾秒鐘內完成分析,並且只有tempdb
(而不是數萬億)的幾千條記錄。SQL Server停止發送記錄
該代碼已使用數年。今天,其中一個變量輸入增長了兩倍,傳統的大小和SQL Server是可以完成運行的代碼。它將停止發送數據用於其中一個預處理步驟。完整的代碼是非常冗長和複雜的,包括在這裏,而是說明發生了什麼:
/* Lots of SQL code */
print 'debug 1'
select distinct field
from #table
print 'debug 2'
select several..fields
from many..tables..joined..with..temp..tables
where multiple..conditions
group by several..fields
print 'debug 3'
如果我們執行的SSMS(數據庫服務器上運行)的代碼,我們可以簡單地運行代碼到print 'debug 2'
行以及從select distinct field
聲明立即返回的330條記錄。
如果我們運行所有代碼,則只會從select distinct field
語句返回290-325(左右)個記錄,然後數據庫服務器的CPU開始出現顛簸。它永遠不會返回330條記錄的其餘部分,並且debug 2
永遠不會打印到消息選項卡/窗口。即使我們在運行數小時後中止查詢,結果選項卡/窗口中的記錄數也少於330,並且不打印debug 2
。
這就像第二個select
語句使SQL Server無法完成返回第一個select
語句的所有行。
我比較了兩者(帶和不帶最後一條語句)的查詢計劃,它們與print 'debug 2'
行相同。我嘗試向#temp表中添加索引,更新數據庫中的統計信息,並將最後的select
語句移至存儲過程以幫助隔離代碼。沒什麼幫助。
有沒有人看到Microsoft SQL Server 2008 R2(SP1)在執行SQL語句的過程中停止發送記錄?你做了什麼來解決它?
我從來沒有見過,但我還沒有使用SQL Server很長時間。調試2和調試3之間的查詢有多少行?此外,對不起,如果這是一個新手問題,但大小加倍的變量,是否將其放入另一個未輸入以適應新加倍大小的變量? – bf2020
@ bf2020 - 好問題。中間只有三行代碼。他們打開一個光標並開始通過記錄進行光標掃描。大小加倍的變量是一個數據集,其記錄的數量是平時的兩倍。所有變量都被適當地鍵入並且沒有數據被截斷。 –
您是否嘗試將事務添加到光標? – 2014-03-12 20:21:23