讓我們有一個包含35個主鍵(autoinc bigint)和3個非集羣非唯一索引(每個索引一個int列)。爲什麼我會得到「數據庫'tempdb'的日誌文件已滿'
在表列有兩個日期時間字段:
PAYMENT_DATE
datetime NOT NULL
EDIT_DATE
datetime NULL
表大約有1 200 000行。 只有〜1000行具有edit_date column = null。 9000行有EDIT_DATE不空,不等於PAYMENT_DATE 別人有EDIT_DATE = PAYMENT_DATE
當我們運行以下查詢1:
select top 1 *
from payments
where edit_date is not null and (payment_date=edit_date or payment_date<>edit_date)
order by payment_date desc
服務器需要一對夫婦幾秒鐘就可以做到。但是,如果我們運行查詢2:
select top 1 *
from payments
where edit_date is not null
order by payment_date desc
執行與結束了對tempdb數據庫中的日誌文件已滿。備份數據庫的事務日誌以釋放一些日誌空間。
如果我們更換*與某些特定的列,見查詢3
select top 1 payment_date
from payments
where edit_date is not null
order by payment_date desc
也完成在幾秒鐘。
魔法在哪裏?
編輯 我已經更改了查詢1,以便它的操作與第二個查詢的行數完全相同。並且它仍然在一秒鐘內返回,而查詢2填充tempdb。
ANSWER 我跟着建議添加一個索引,這樣做兩個日期字段 - 一切都開始工作快速,符合市場預期。雖然,問題是 - 爲什麼在這種情況下,sql server在類似的查詢(查詢1對查詢2)上表現不同?我想了解服務器優化的邏輯。我同意,如果兩個查詢都使用tempdb類似,但他們沒有......
最後,我標記爲第一個答案,在那裏我看到了我的問題和第一個問題的必然症狀,以及如何避免這種想法(即的indeces)
你有沒有考慮以下錯誤消息的建議嗎?某些查詢將需要使用tempdb,並且如果日誌文件已滿,則不能執行其他事務。 – 2012-08-09 03:11:58
@AndrewBarber我didn't..but什麼,我試圖找出是爲什麼幾乎相似的查詢,完全不同執行...和我怎麼有望建成查詢來避免這種behaivour的.. – horgh 2012-08-09 03:46:15
不要使用* *選擇所有列,對於初學者。並備份該事務日誌。 – 2012-08-09 03:47:51