Bugün veritabanlarımı depolayan sabit diski dolu buldum. Bu daha önce olmuştu, genellikle nedeni oldukça belirgindir. Genellikle büyük bir dökülme tempdb disk dolu olana kadar büyür neden kötü bir sorgu vardır. Bu sefer ne olduğu biraz daha az belirgindi, tempdb tam sürücünün nedeni olmadığından, veritabanının kendisiydi.
Gerçekler:
- Genel veritabanı boyutu yaklaşık 55 GB, 605 GB'a çıktı.
- Günlük dosyasının boyutu normal, veri dosyası çok büyük.
- Datafile% 85 kullanılabilir alana sahiptir (Bunu 'air' olarak yorumluyorum: kullanılan, ancak serbest bırakılan alan. SQL Server ayrıldıktan sonra tüm alanı ayırır).
- Tempdb boyutu normal.
Muhtemel nedeni buldum; çok fazla satır seçen bir sorgu var (kötü birleşme birkaç yüz binin beklendiği 11 milyar sıra seçimine neden oluyor). Bu, SELECT INTO
aşağıdaki senaryoların gerçekleşip gerçekleşmediğini merak etmemi sağlayan bir sorgudur:
- SELECT INTO yürütülür
- Hedef tablo oluşturuldu
- Veri seçildiği gibi eklenir
- Disk dolar ve eklemenin başarısız olmasına neden olur
- SELECT INTO iptal edildi ve geri alındı
- Geri alma alanı boşaltır (zaten eklenmiş veriler kaldırılır), ancak SQL Server serbest alanı serbest bırakmaz.
Ancak bu durumda, tarafından oluşturulan tablonun SELECT INTO
hala var olmasını beklemezdim, geri alma tarafından düşürülmelidir. Bunu test ettim:
BEGIN TRANSACTION
SELECT T.x
INTO TMP.test
FROM (VALUES(1))T(x)
ROLLBACK
SELECT *
FROM TMP.test
Bunun sonucu:
(1 row affected)
Msg 208, Level 16, State 1, Line 8
Invalid object name 'TMP.test'.
Ancak hedef tablo var. Ancak gerçek sorgu açık bir işlemde yürütülmedi, bu hedef tablonun varlığını açıklayabilir mi?
Burada çizdiğim varsayımlar doğru mu? Bu gerçekleşmesi muhtemel bir senaryo mu?