Neden INDEX CREATE… ONLINE ile = ON birkaç dakika boyunca masaya erişimi engelliyor?


22

Mevcut bir masam var:

CREATE TABLE dbo.ProofDetails
(
    ProofDetailsID int NOT NULL 
        CONSTRAINT PK_ProofDetails 
        PRIMARY KEY CLUSTERED IDENTITY(1,1)
    , ProofID int NULL
    , IDShownToUser int NULL
    , UserViewedDetails bit NOT NULL 
        CONSTRAINT DF_ProofDetails_UserViewedDetails 
        DEFAULT ((0))
);

Bu tabloda 150.000.000 satır var. Sistem 24x7x365 işletimde olduğundan, düzenli olarak meydana gelen bakım pencereleri yoktur.

Tabloya bir dizin eklemek istiyorum ve SQL Server'ın Enterprise sürümü ile bunu, tabloya yazma erişimini engellemeden yapabilmeliyim. Kullandığım komut şuydu:

CREATE INDEX IX_ProofDetails_ProofID_Etc 
ON dbo.ProofDetails (ProofID, IDShownToUser)
INCLUDE (UserViewedDetails)
WITH (ONLINE=ON
    , ALLOW_ROW_LOCKS=ON
    , ALLOW_PAGE_LOCKS=ON
    , FILLFACTOR=100
    , MAXDOP=4
);

İfadeyi SSMS'de tuşuna basarak kendim yürüttüm F5. Bir dakikadan fazla sürdü, ardından diğer oturumları engellemeye başladı. Daha sonra CREATE INDEXdiğer oturumları engelleyemediğim için hemen komutu iptal ettim.

İlk dakikadan sırasında, hiçbir şey benim engellediğini CREATE INDEXkomutu, sys.dm_exec_requestsbir bekleme Çeşidi ile süreci gösterdi CXPACKETtabii ki -. Operasyon paralelleştirildiği için bunun kötü bir şey olduğunu sanmıyorum.

Çıktısını incelemek için çok zamanım olmadı sys.dm_exec_requests. Sorgudan dönen tek bir satır vardı WHERE session_id = xxx. Engellenen oturumlar, hedef tabloya satır eklemeye çalışıyordu.

Kilitlerin ne kadar sürdüğünü bilmiyorum, açıklamanın başlamasından yaklaşık 2 dakika sonra ifadenin uygulanmasını iptal ettiğimi söylemek dışında. Bloklar bu noktada bir dakika kadar meydana geldi.

Uygulanmasını yanlış WITH (ONLINE=ON)mı anlıyorum ? Yoksa bilmem gereken başka bir şey var mı?

Sunucu 2 adet dört çekirdekli Xeon E5-2643 3.3Ghz işlemci, 192GB RAM ve 5.000'den fazla iops kapasiteli SAN depolama alanına sahip oldukça etli bir makinedir. CPU tipik olarak% 20'nin altındadır, RAM, çoğunlukla SQL Server tarafından% 93 oranında kullanılmaktadır. Kutuda çalışan hiçbir şey yok, yalnızca Windows Server 2012 ve SQL Server 2012.

Yanıtlar:


23

Çevrimiçi = açık olan bir dizin oluştururken, dizin oluşturma işlemi, dizin nesnesinin kendisini oluştururken engellenmez, ancak işlemin sonuna geldiğinde, gerçekte bir süre için bir şema değiştirme kilidi * elde eder. Dizini tabloya ekle, bu kilit türü, kilitleme işleminden sorumlu olabilecek kilit serbest bırakılıncaya kadar tüm dış işlemleri engelleyecektir.

* Sch-MDiğer tüm durumlarda gerekli olmasına rağmen, kümelenmemiş yeni bir dizinin çevrimiçi oluşturulması için bir kilit gerekli değildir. Yeni bir kümelenmemiş indeks, son aşamada sadece hazırlık aşamasında gerekli olan aynı masa seviyesinde paylaşılan kilit gerektirir.

Ayrıntılar için bu Teknik İnceleme'ye bakın:

SQL Server 2005'te Çevrimiçi Dizin Oluşturma İşlemleri

Muştaq Muhammed'in soruyla ilgili yorumunda önerildiği gibi , ayrıca bakınız:

Tek boynuzlu atlar, gökkuşağılar ve Paul Randal tarafından çevrimiçi indeks işlemleri

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.