Bu yüzden, hazırlama tablomuzdan veri almak ve datamart'ımıza taşımak için basit bir Toplu Ekle işlemim var.
İşlem, "Toplu iş başına satır" için varsayılan ayarları olan basit bir veri akışı görevidir ve seçenekler "tablock" ve "kontrol kısıtlaması yok" şeklindedir.
Tablo oldukça büyük. 201 GB ve 49 GB dizin alanı ile 587.162.986 veri boyutu. Tablo için kümelenmiş dizin.
CREATE CLUSTERED INDEX ImageData ON dbo.ImageData
(
DOC_ID ASC,
ACCT_NUM ASC,
MasterID ASC
)
Ve Birincil Anahtar:
ALTER TABLE dbo.ImageData
ADD CONSTRAINT ImageData
PRIMARY KEY NONCLUSTERED
(
ImageID ASC,
DT_CRTE_DOC ASC
)
Şimdi BULK INSERT
SSIS üzerinden inanılmaz yavaş çalışan bir sorun yaşıyoruz . Bir milyon satır eklemek için 1 saat. Tabloyu dolduran sorgu zaten sıralanır ve doldurulması gereken sorgunun çalışması bir dakikadan az sürer.
İşlem çalışırken, 5 ila 20 saniye arasında herhangi bir yere götüren ve bir bekleme türü gösteren BULK insertinde bekleyen sorguyu görebiliyorum PAGEIOLATCH_EX
. İşlem INSERT
bir seferde sadece bin sıraya kadar çıkabilir.
Dün bu süreci UAT ortamım karşısında test ederken aynı sorunla karşılaşıyordum. Süreci birkaç kez çalıştırıyordum ve bu yavaş eklemenin kök nedeninin ne olduğunu belirlemeye çalışıyordum. Sonra aniden 5 dakikadan kısa sürede koşmaya başladı. Bu yüzden aynı sonuçla birkaç kez daha çalıştırdım. Ayrıca 5 saniye veya daha uzun süre beklemede olan toplu kesici uçların sayısı yüzlerce ila yaklaşık 4 arasındadır.
Şimdi bu şaşırtıcı, çünkü aktivitede büyük bir düşüş yaşadığımız gibi değil.
Süre boyunca CPU düşük.
Daha yavaş olduğu zaman diskte daha az bekleme var gibi görünüyor.
Disk gecikmesi, işlemin 5 dakikadan daha kısa bir sürede çalıştığı zaman dilimi boyunca artar.
Ve bu sürecin zayıf olduğu zamanlarda ES çok daha düşüktü.
Zaten kontrol ettim ve dosyalar sadece% 70 dolu olduğu için dosya büyümesi olmadı. Günlük dosyasının hala% 50'si var. DB Basit Kurtarma modundadır. DB yalnızca bir dosya grubuna sahiptir ancak 4 dosyaya yayılmıştır.
Merak ettiğim şey A: neden bu toplu eklemelerde bu kadar büyük bekleme süreleri görüyordum. B: daha hızlı çalışmasını sağlayan ne tür bir büyü oldu?
Kenar notu. Bugün yine saçmalık gibi çalışıyor.
GÜNCELLEME şu anda bölümlendirilmiştir. Ancak en iyi aptalca bir yöntemle yapılır.
CREATE PARTITION SCHEME [ps_Image] AS PARTITION [pf_Image]
TO ([FG_Image], [FG_Image], [FG_Image], [FG_Image])
CREATE PARTITION FUNCTION [pf_Image](datetime) AS
RANGE RIGHT FOR VALUES (
N'2011-12-01T00:00:00.000'
, N'2013-04-01T00:00:00.000'
, N'2013-07-01T00:00:00.000'
);
Bu, esas olarak 4. bölümdeki tüm verileri bırakır. Ancak hepsi aynı dosya grubuna gittiğinden. Veriler şu anda bu dosyalar arasında eşit olarak bölünüyor.
GÜNCELLEME 2 Bunlar, süreç zayıf çalıştığında genel bekleyişlerdir.
Bu sürecin iyi çalıştığı dönemlerde beklediğim süreç iyi çalışıyor.
Depolama altsistemi yerel olarak bağlı RAID'dir, SAN yoktur. Günlükler farklı bir sürücüde. Raid Controller, 1 GB önbellek boyutuna sahip PERC H800'dür. (UAT için) Prod bir PERC'dir (810).
Yedeklemeden basit kurtarma kullanıyoruz. Her gece bir üretim kopyasından geri yüklenir.
IsSorted property = TRUE
Veriler zaten sıralandığından SSIS'yi de ayarladık .
PAGEIOLATCH_EX
ve ASYNC_IO_COMPLETION
diskten belleğe veri almanın biraz zaman aldığını gösteriyor. Bu, disk alt sistemindeki bir sorunun göstergesi olabilir veya bellek çekişmesi olabilir. SQL Server'da ne kadar bellek var?
ASYNC_NETWORK_IO
SQL Server'ın bir istemciye bir yere satır göndermeyi beklediği anlamına gelir . Sanırım bu aşama tablodan SSIS tüketen satırların faaliyet göstermektedir.