2013-04-02 43 views
1

我有一張表列出了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

回答

1

一個)該查詢「從Patient_Clinic_Visits SELECT 1」將返回一個空的結果集(如果Patient_Clinic_Visits表是空的),或者一個結果集與儘可能多的行作爲Patient_Clinic_Visits表,每行有一個1。爲此,SQL Server將必須針對整個Patient_Clinic_Visits表發出查詢,該表(假定默認鎖定行爲)將導致共享(讀取)鎖成爲該表中行的問題。

b)我可能會丟失一些東西,但是我沒有看到你在哪裏出現了基於sp_whosactive的「來自Patient_Clinic_Vists的SELECT 1」查詢。瞭解從應用程序發送到數據庫服務器的SQL的最佳方法可能是使用帶有適當過濾器的SQL Profiler(可能僅過濾來自運行應用程序的主機的連接)。

+0

謝謝,很好地解釋它。我很抱歉,但sp_whosactive沒有出現正確的格式化由stackoverflow和查詢被重現爲XML字符串,並被編輯出來 - 我已經修復它。我正在運行SQLSERVER2005 Express。我不相信Sql Profiler隨此版本提供。 – dmc2005

+0

我發現「選擇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

相關問題