Saya menjalankan beberapa tes di Database SQL dan menemukan setidaknya satu operasi baru yang mendukung ONLINE = ON
. Omong-omong, ini ada di versi yang sangat baru – SELECT @@VERSION;
terus menghasilkan nomor build lama, tetapi buktinya ada pada tanggal build:
12 Feb 2015 00:53:13
Hak Cipta (c) Microsoft Corporation
Versi Azure SQL Database ini mendukung ONLINE = ON
opsi untuk ALTER TABLE ... ALTER COLUMN
.
Katakanlah Anda memiliki tabel dengan kolom nullable:
CREATE TABLE dbo.a(id INT PRIMARY KEY, x VARCHAR(255)); INSERT dbo.a(id, x) SELECT TOP (1) [object_id], name FROM sys.all_objects;
Dan sekarang Anda memutuskan untuk membuat kolom itu tidak dapat dibatalkan, Anda dapat melakukan ini (dengan asumsi tidak ada NULL
s):
ALTER TABLE dbo.a ALTER COLUMN x VARCHAR(255) NOT NULL WITH (ONLINE = ON);
Anda juga dapat melakukan hal-hal seperti mengubah susunan, tipe data, atau ukuran kolom:
ALTER TABLE dbo.a ALTER COLUMN x NVARCHAR(510) -- changed data type and length COLLATE Albanian_BIN NOT NULL -- changed collation and nullability WITH (ONLINE = ON);
Dalam versi SQL Server saat ini (dan versi Azure SQL Database sebelumnya), ONLINE = ON
petunjuk tidak didukung untuk ALTER TABLE
, dan tanpa opsi, ini adalah operasi pemblokiran dan ukuran data. Agar adil, pertama kali saya menjalankan kode, saya hanya bisa membuktikan bahwa versi dengan ONLINE = ON
berjalan dengan sukses, bukan karena berfungsi seperti yang diiklankan.
Saya menjalankan kode ini dengan ONLINE = ON
dan tanpa:
CREATE TABLE dbo.a(id INT PRIMARY KEY, x VARCHAR(255)); INSERT dbo.a(id, x) SELECT TOP (1) [object_id], name FROM sys.all_objects; -- placeholder; ALTER TABLE dbo.a ALTER COLUMN x NVARCHAR(510) COLLATE Albanian_BIN NOT NULL -- WITH (ONLINE = ON); -- placeholder; DROP TABLE dbo.a;
Di --placeholder
spot, saya mencoba beberapa hal untuk menentukan perbedaan perilaku (ini adalah Database SQL produksi kami, jadi saya tidak ingin menggunakan data yang cukup atau membuat aktivitas yang cukup sehingga perbedaannya akan terlihat jelas). Saya ingin memeriksa kedua skenario apakah halaman telah berubah (menunjukkan operasi online yang sebenarnya) atau jika nilainya diperbarui pada halaman yang ada (operasi yang tidak terlalu online). Saya juga dapat memperluas pengujian untuk melihat berapa banyak halaman baru yang dibuat jika halaman penuh dan/atau semua 255 karakter digunakan, tetapi saya pikir hanya dengan melihat apakah halaman diubah saja sudah cukup.
Saya mencoba DBCC IND()
:
DBCC IND(N'dbname', N'dbo.a', 1, 1);
Hasilnya di sini tidak mengejutkan:
Pesan 40518, Level 16, Status 1Perintah DBCC 'IND' tidak didukung dalam versi SQL Server ini.
Dan sys.dm_db_database_page_allocations
(pengganti DBCC IND
):
SELECT allocated_page_page_id FROM sys.dm_db_database_page_allocations(DB_ID(),OBJECT_ID(N'dbo.a'),1,1,N'LIMITED') WHERE is_iam_page = 0;
Ini menghasilkan kumpulan hasil yang kosong – saya percaya ini adalah desain bahwa fungsi manajemen dinamis ini tidak mengekspos informasi fisik apa pun di Azure SQL Database.
Selanjutnya, saya mencoba trik dengan fn_PhysLocCracker
, yang pernah diblog oleh orang-orang seperti Michelle Ufford (@sqlfool) sebelumnya:
SELECT l.page_id FROM dbo.a OUTER APPLY sys.fn_PhysLocCracker(%%PhysLoc%%) AS l;
Kesuksesan! Ini mengembalikan nilai untuk halaman yang digunakan dalam pemindaian terhadap dbo.a
, dan jelas bahwa di ONLINE = ON
versi, data dipindahkan ke halaman baru (mungkin meninggalkan yang lama tersedia selama operasi), dan tanpa petunjuk, data dan metadata diperbarui di tempat:
Membandingkan halaman dengan perilaku ALTER COLUMN standar (kiri) dengan ONLINE =ON (kanan)
Hal lain yang ingin saya bandingkan adalah rencana eksekusi. Saya mungkin tidak melihat banyak di Management Studio, tetapi di SQL Sentry Plan Explorer Pro, saya dapat melihat tumpukan panggilan lengkap, termasuk apa yang terjadi di balik layar dari beberapa perintah DDL. Alat kami tidak mengecewakan – meskipun tidak menyajikan rencana aktual untuk variasi pembaruan di tempat, alat ini juga menunjukkan bahwa ada perbedaan perilaku yang signifikan saat menggunakan ONLINE = ON
:
Membandingkan paket berdasarkan perilaku ALTER COLUMN standar (kiri) dengan ONLINE =AKTIF (kanan)
Tentu saja, Anda hanya akan melihat perbedaan ini jika Anda memenuhi semua kondisi lain yang diperlukan untuk operasi online (banyak yang mirip dengan persyaratan untuk membangun kembali indeks online) dalam dokumentasi yang baru saja diperbarui.
Sekarang, jika Anda tidak menggunakan Database SQL, bagaimana hal itu membantu Anda? Lagi pula, sintaks ini tidak diurai dengan benar bahkan di SQL Server 2014 Cumulative Update #6 (12.0.2480). Yah, Microsoft belum benar-benar menjaga fakta bahwa pola pengembangan telah menjadi "cloud pertama, lalu kotak" – seperti yang baru-baru ini tersirat oleh Mark Souza ketika dia men-tweet tentang fitur keamanan tingkat baris baru yang diperkenalkan pertama kali di Azure SQL Database:
Keamanan tingkat baris. Diminta banyak oleh komunitas #sqlserver. http://t.co/pp0sNr8Nt5 Cloud terlebih dahulu tetapi Anda tahu apa artinya itu. Akan datang
— Mark Souza (@mark_AzureCAT) 8 Februari 2015
Ini berarti bahwa operasi online ini kemungkinan akan segera datang ke salinan lokal SQL Server Anda. Namun, seperti banyak operasi online lainnya, perlu diingat bahwa hal-hal ini cenderung dicadangkan untuk Edisi Perusahaan.