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 INDEX
perintah karena saya tidak dapat memblokir sesi lain.
Selama menit pertama, tidak ada yang menghalangi CREATE INDEX
perintah saya , sys.dm_exec_requests
menunjukkan 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.