我有一張表列出了patient_clinic_visits。我有SQLSERVER 2005後端。 Access2010前端。爲什麼「SELECT 1 from <table>」導致另一個進程執行DELETE時出現LCK_M_IX
每天早上該表需要從醫院大型機的數據轉儲刷新。
此數據轉儲包括前一天(誰出席,沒有取消)和未來6周的預約預約信息。
因此,我「刪除*從Patient_clinic_visits其中VISIT_DATE>(一天)和<(一天+ 1)一些處理之後上載新數據之前清理每天反過來表。
在大多數日子裏,每天只有大約100-150條記錄,它們是Master_Patient_Table中Pat_ID的一個外鍵,其上有NO_ACTION鏈
此時此刪除查詢在Access中超時在處理了幾天的數據之後(即它在星期一,星期二,星期三的工作正常...)
我運行sp_whoisactive並獲得:
00 01:53:01.926 52 [[查詢SELECT 1 FROM 「DBO」 「Patient_Clinic_Visits」]。] RAHCC_User(265ms)ASYNC_NETWORK_IO 0 0 0 NULL 51 0 0 2懸浮0 NULL SAH0020663 RAHCC_DB微軟MDB RAHCC 2013年4月2日09:08:33.027 0 2013年4月2日11:01:35.033
00 00:00:27.610 53 [[查詢 - 從Patient_Clinic_Visits WHERE clinic_date DELETE > = '26 -Mar-2013'AND clinic_date < '27 -Mar-2013'AND Clinic_location ='MONC']] HAD \ jhogan05(27596ms)LCK_M_IX 16 0 0 52 1,074 0 0 130暫停2 NULL SAH0048645 RAHCC_DB Microsoft SQL Server中號anagement Studio Express的 - 查詢2013年4月2日11:01:07.343 0 2013年4月2日11:01:35.033
這表明我的客戶前端在等待一個 「SELECT 1從Patient_Clinic_Vists」,這正在阻止該程序。顯然這是由於客戶端上的ASYNC_NETWORK_IO(這可能發生在Access前端執行表請求然後不處理數據)。
a)然而,「來自Patient_Clinic_Visits的SELECT 1」實際上只應該返回TRUE或FALSE?這是不太可能填滿任何東西,並不清楚爲什麼會導致塊狀況?
b)我無法在任何地方在我的Access前端找到「SELECT 1 ...」。這可能是SQLSERVER響應更多的完成選擇而產生的子選擇序列的一部分嗎?如果是這樣,我怎麼才能找到真正的選擇導致這個過程歷史中的這種情況?
歡呼聲,
JonHD
謝謝,很好地解釋它。我很抱歉,但sp_whosactive沒有出現正確的格式化由stackoverflow和查詢被重現爲XML字符串,並被編輯出來 - 我已經修復它。我正在運行SQLSERVER2005 Express。我不相信Sql Profiler隨此版本提供。 – dmc2005
我發現「選擇1 ...」的來源是以下將「(全部)」選項拼接到組合框結果中的SQL。這是罪魁禍首SQL:<< SELECT DISTINCT Clinic_Location as CL FROM Patient_Clinic_Visits ORDER BY Clinic_Location; UNION SELECT TOP 1「(All)」作爲來自Patient_Clinic_Visits的CL; >>> – dmc2005