Mengapa CREATE INDEX… WITH ONLINE = ON memblokir akses ke tabel selama beberapa menit?

22

Saya memiliki tabel yang sudah ada:

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))
);

Tabel ini memiliki 150.000.000 baris. Sistem ini beroperasi 24x7x365, sehingga tidak ada jendela pemeliharaan yang terjadi secara teratur.

Saya ingin menambahkan indeks ke tabel, dan dengan edisi SQL Server Perusahaan, saya harus dapat melakukannya tanpa memblokir akses tulis ke tabel. Perintah yang saya gunakan adalah:

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
);

Saya menjalankan pernyataan itu sendiri di SSMS, dengan menekan F5. Itu berlari lebih dari satu menit, kemudian mulai memblokir sesi lain. Saya kemudian segera membatalkan CREATE INDEXperintah karena saya tidak dapat memblokir sesi lain.

Selama menit pertama, tidak ada yang menghalangi CREATE INDEXperintah saya , sys.dm_exec_requestsmenunjukkan proses dengan tipe menunggu CXPACKET- tentu saja. Saya tidak berpikir itu hal yang buruk karena operasi itu diparalelkan.

Saya tidak punya banyak waktu untuk memeriksa hasilnya sys.dm_exec_requests. Hanya ada satu baris yang dikembalikan dari kueri WHERE session_id = xxx. Sesi yang diblokir berusaha untuk memasukkan baris ke tabel target.

Saya tidak tahu berapa lama kuncinya berlangsung, kecuali untuk mengatakan saya membatalkan eksekusi pernyataan sekitar 2 menit setelah dimulai. Blok terjadi sekitar satu menit pada saat itu.

Apakah saya salah memahami implementasi WITH (ONLINE=ON)? Atau ada hal lain yang perlu saya waspadai?

Server ini adalah mesin yang cukup kuat, dengan 2 prosesor quad-core Xeon E5-2643 3.3Ghz, RAM 192GB, dan penyimpanan SAN yang mampu mencapai 5.000+ iops. CPU biasanya di bawah 20%, RAM 93% digunakan, sebagian besar oleh SQL Server. Tidak ada yang berjalan di kotak, hanya Windows Server 2012, dan SQL Server 2012.

Max Vernon
sumber

Jawaban:

23

Saat membuat indeks dengan online = on, proses membuat indeks tidak akan memblokir ketika membuat objek indeks itu sendiri, tetapi ketika mendekati akhir proses, itu akan mendapatkan kunci modifikasi skema * untuk suatu periode untuk benar-benar tambahkan indeks ke tabel, jenis kunci ini akan memblokir semua operasi di luar sampai kunci dilepaskan, yang dapat menjelaskan masalah pemblokiran Anda.

* Sch-MKunci tidak diperlukan untuk pembuatan indeks nonclustered baru secara daring, meskipun diperlukan dalam semua kasus lainnya. Indeks nonclustered baru hanya membutuhkan kunci bersama tingkat-tabel selama fase akhir, sama seperti yang diperlukan selama fase persiapan.

Lihat Buku Putih ini untuk detail:

Operasi Pengindeksan Online di SQL Server 2005

Seperti yang disarankan oleh Mushtaq Mohammed dalam komentar pada pertanyaan, juga lihat:

Unicorn, pelangi, dan operasi indeks online oleh Paul Randal

steoleary
sumber