Aracılığıyla paylaş


Çevrimiçi dizin işlemleri için yönergeler

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Çevrimiçi dizin işlemleri gerçekleştirdiğinizde aşağıdaki yönergeler geçerli olur:

  • Temel alınan tablo şu büyük nesne (LOB) veri türlerini içerdiğinde kümelenmiş dizinler oluşturulmalıdır, yeniden oluşturulmalıdır veya çevrimdışı bırakılmalıdır: resim, ntext ve metin.

  • Tablonun LOB veri türlerini kullanan sütunları olduğunda ancak bu sütunlardan hiçbiri dizin tanımında anahtar veya dahil edilen sütunlar olarak kullanılmadığında, eşsiz olmayan küme dışı dizinler çevrimiçi olarak oluşturulabilir.

  • Yerel geçici tablolara ait dizinler oluşturulamaz, yeniden oluşturulamaz veya çevrimiçi durumda bırakılamaz. Bu kısıtlama, genel geçici tablolardaki dizinler için geçerli değildir.

  • RESUMABLE veya ALTER INDEX yan tümcesini kullanarak çevrimiçi dizin işlemini devam ettirilebilir bir işlem olarak başlatabilirsiniz. Devam ettirilebilir dizin işlemi, beklenmeyen bir hata, veritabanı yük devretmesi veya bir ALTER INDEX PAUSE komutundan sonra yeniden başlatılabilir ve kesintiye uğradığı yerden devam edebilir.

Note

Çevrimiçi dizin işlemleri Microsoft SQL Server'ın her sürümünde kullanılamaz. SQL Server sürümleri tarafından desteklenen özelliklerin listesi için bkz. Sürümleri ve SQL Server 2022'nin desteklenen özellikleri.

Aşağıdaki tabloda, çevrimiçi olarak gerçekleştirilebilecek dizin işlemleri, bu çevrimiçi işlemlerin dışında tutulan dizinler ve devam ettirilebilen dizin kısıtlamaları gösterilmektedir. Ek kısıtlamalar da dahildir.

Çevrimiçi dizin işlemi Dışlanan dizinler Diğer kısıtlamalar
ALTER INDEX REBUILD Devre dışı bırakılmış kümelenmiş dizin veya devre dışı bırakılmış dizinli görünüm

XML dizini

Yerel geçici tablodaki dizin
Anahtar sözcüğünü ALL belirtmek, tablo dışlanmış bir dizin içerdiğinde işlemin başarısız olmasına neden olabilir.

Devre dışı bırakılan dizinleri yeniden oluşturmayla ilgili ek kısıtlamalar uygulanır. Daha fazla bilgi için bkz. Dizinleri ve kısıtlamaları devre dışı bırakma.
CREATE INDEX XML dizini

Görünümde ilk benzersiz kümelenmiş dizin

Yerel geçici tablodaki dizin
CREATE INDEX WITH DROP_EXISTING Devre dışı bırakılmış kümelenmiş dizin veya devre dışı bırakılmış dizinli görünüm

Yerel geçici tablodaki dizin

XML dizini
DROP INDEX Devre dışı bırakılmış dizin

XML dizini

Kümelenmemiş dizin

Yerel geçici tablodaki dizin
Tek bir deyim içinde birden çok dizin belirtilemiyor.
ALTER TABLE ADD CONSTRAINT (PRIMARY KEY veya UNIQUE) Yerel geçici tablodaki dizin

Kümelenmiş indeks
Aynı anda yalnızca bir alt maddeye izin verilir. Örneğin, aynı PRIMARY KEY deyiminde UNIQUE veya ALTER TABLE kısıtlama ekleme ve kaldırma işlemlerini gerçekleştiremezsiniz.
ALTER TABLE DROP CONSTRAINT (PRIMARY KEY veya UNIQUE) Kümelenmiş indeks

Temel tablo, çevrimiçi dizin işlemi devam ederken değiştirilemez, kırpılamaz veya silinemez.

Kümelenmiş dizini oluşturduğunuzda veya bıraktığınızda belirtilen çevrimiçi seçenek ayarı (ON veya OFF), yeniden oluşturulması gereken kümelenmemiş dizinlere uygulanır. Örneğin, kümelenmiş dizin kullanılarak CREATE INDEX WITH DROP_EXISTING, ONLINE = ONçevrimiçi oluşturulduysa, ilişkili tüm kümelenmemiş dizinler de çevrimiçi olarak yeniden oluşturulur.

Bir dizini çevrimiçi olarak oluşturduğunuzda veya yeniden UNIQUE derlediğinizde, dizin oluşturucusu ve eşzamanlı kullanıcı işlemi aynı anahtarı eklemeye çalışabilir ve bu nedenle benzersizliği ihlal edebilir. Kaynak tablodaki özgün satır yeni dizine taşınmadan önce kullanıcı tarafından girilen bir satır yeni dizine (hedef) eklenirse çevrimiçi dizin işlemi başarısız olur.

Yaygın olmasa da, çevrimiçi dizin işlemi kullanıcı veya uygulama etkinlikleri nedeniyle veritabanı güncelleştirmeleriyle etkileşime geçtiğinde kilitlenmeye neden olabilir. Bu nadir durumlarda, kullanıcı veya uygulama etkinliği kilitlenme kurbanı olarak seçilir.

Aynı tabloda eşzamanlı çevrimiçi dizin DDL işlemleri gerçekleştirebilir veya yalnızca birden çok yeni kümelenmemiş dizin oluştururken veya kümelenmemiş dizinleri yeniden düzenlerken görüntüleyebilirsiniz. Aynı anda gerçekleştirilen diğer tüm çevrimiçi dizin işlemleri başarısız olur. Örneğin, mevcut bir dizini aynı tabloda çevrimiçi olarak yeniden oluştururken çevrimiçi olarak yeni dizin oluşturamazsınız.

Bir dizin büyük nesne türünde bir sütun içerdiğinde ve aynı işlem çevrimiçi dizin işlemi başlamadan önce veri değişiklikleri yaptığında çevrimiçi işlem gerçekleştirilemez. Bu sorunu geçici olarak çözmek için çevrimiçi dizin işlemini işlemin dışına taşıyın veya aynı işlemdeki veri değişikliklerinden önce taşıyın.

Disk alanıyla ilgili dikkat edilmesi gerekenler

Çevrimiçi dizin işlemleri, çevrimdışı dizin işlemlerinden daha fazla disk alanı gerektirir.

  • Dizin oluşturma ve dizin yeniden oluşturma işlemleri sırasında dizinin oluşturulması (veya yeniden oluşturulması) için ek alan gerekir. Bu ek alan genellikle dizinin kapladığı geçerli alanla aynıdır, ancak geçerli veya yeniden oluşturulmuş dizinde kullanılan sıkıştırmaya bağlı olarak daha büyük veya daha küçük olabilir.

  • Ayrıca geçici eşleme dizini için de disk alanı gerekir. Bu geçici dizin, kümelenmiş dizin oluşturan, yeniden oluşturan veya bırakan çevrimiçi dizin işlemleri için kullanılır.

  • Kümelenmiş dizini çevrimiçi durumda bırakmak için kümelenmiş dizini çevrimiçi oluştururken (veya yeniden oluştururken) gerekli olduğu kadar alan gerekir.

Daha fazla bilgi için bkz. Dizin DDL işlemleri için disk alanı gereksinimleri.

Performansla ilgili dikkat edilmesi gerekenler

Çevrimiçi dizin işlemleri eşzamanlı kullanıcı güncelleştirme etkinliğine izin verse de, güncelleştirme etkinliği ağırsa dizin işlemleri daha uzun sürebilir. Genellikle, çevrimiçi dizin işlemleri eş zamanlı güncelleştirme etkinliği düzeyinden bağımsız olarak eşdeğer çevrimdışı dizin işlemlerinden daha yavaştır.

Çevrimiçi dizin işlemi sırasında hem kaynak hem de hedef yapılar korunacağından, ekleme, güncelleştirme ve silme işlemleri için kaynak kullanımı artırılır ve potansiyel olarak iki katına çıkar. Bu, dizin işlemi sırasında performansta düşüşe ve özellikle CPU süresinde daha fazla kaynak kullanımına neden olabilir. Çevrimiçi dizin işlemleri tamamen günlüğe kaydedilir.

Çevrimiçi işlemleri önersek de ortamınızı ve belirli gereksinimleri değerlendirmeniz gerekir. Dizin işlemlerini çevrimdışı çalıştırmak en uygun olabilir. Bunu yaparken, işlem sırasında verilere kullanıcı erişimi kısıtlanır, ancak işlem daha hızlı tamamlanır ve daha az kaynak kullanır.

SQL Server 2016 (13.x) ve sonraki sürümleri çalıştıran çok işlemcili bilgisayarlarda dizin işlemleri, dizin deyimiyle ilişkili tarama ve sıralama işlemlerini gerçekleştirmek için paralellik kullanabilir. Çevrimiçi dizin işleminin MAXDOP paralellik derecesini denetlemek için dizin seçeneğini kullanabilirsiniz. Bu şekilde, dizin işlemi tarafından kullanılan kaynakları eşzamanlı kullanıcıların kaynaklarıyla dengeleyebilirsiniz. Daha fazla bilgi için bkz . Paralel dizin işlemlerini yapılandırma. Paralel dizin işlemlerini destekleyen SQL Server sürümleri hakkında daha fazla bilgi için bkz. SQL Server 2022'nin sürümleri ve desteklenen özellikleri.

Dizin işleminin son aşamasında bir paylaşılan (S) kilit veya şema değişikliği (Sch-M) kilidi tutulduğundan, bir BEGIN TRANSACTION ... COMMIT bloğu gibi açık kullanıcı işlemi içinde çevrimiçi dizin işlemi çalıştırırken dikkatli olun. Bunun yapılması, kilitlerin işlemin sonuna kadar tutulmasına ve diğer iş yüklerinin engellenmesine neden olur.

Dizin sayfası kilitleri kullanılarak ALLOW_PAGE_LOCKS = OFFdevre dışı bırakılırsa, çevrimiçi dizin yeniden derlemesi, 1'den büyük bir değerle MAXDOP çalıştığında dizin parçalanma oranını artırabilir. Daha fazla bilgi için bkz . Nasıl Çalışır: Çevrimiçi Dizin Yeniden Oluşturma - Parçalanma artışına neden olabilir.

İşlem günlüğünde dikkat edilmesi gerekenler

Çevrimdışı veya çevrimiçi olarak gerçekleştirilen büyük ölçekli dizin işlemleri büyük miktarlarda işlem günlüğü oluşturabilir. Bunun nedeni hem çevrimdışı hem de çevrimiçi dizin yeniden oluşturma işlemlerinin tamamen günlüğe kaydedilmesidir. Dizin işleminin geri alınaabildiğinden emin olmak için, dizin işlemi tamamlanana kadar işlem günlüğü kırpılamaz; ancak günlük, dizin işlemi sırasında yedeklenebilir.

Bu nedenle, işlem günlüğünde hem dizin işlemi işlemlerini hem de dizin işlemi sırasındaki eş zamanlı kullanıcı işlemlerini depolamak için yeterli alan olmalıdır. Daha fazla bilgi için bkz. Dizin işlemleri için işlem günlüğü disk alanı.

Hızlandırılmış veritabanı kurtarma (ADR) etkinse çevrimiçi dizin işlemleri yüksek işlem günlüğü büyümesine neden olmaz.

Kalıcı sürüm deposuyla ilgili dikkat edilmesi gerekenler

ADR etkinse, büyük bir dizini çevrimiçi olarak oluşturmak veya yeniden oluşturmak, dizin işlemi devam ederken kalıcı sürüm deposunun (PVS) boyutunu önemli ölçüde artırabilir. Veritabanının PVS'nin büyümesi için yeterli boş alana sahip olduğundan emin olun. Daha fazla bilgi için bkz. Hızlandırılmış veritabanı kurtarmayı izleme ve sorunlarını giderme.

Yeniden başlatılabilir dizin hususları

RESUMABLE ve CREATE INDEX için ALTER INDEX dizin seçeneği, SQL Server (SQL Server 2017 (14.x) ve ALTER INDEX SQL Server 2019 (15.x) ile başlayarak), Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği için geçerlidir. Daha fazla bilgi için bkz. CREATE INDEX ve ALTER INDEX.

RESUMABLE seçeneğini kullanmak için ONLINE seçeneğini de kullanmanız gerekir. Devam ettirilebilen dizin oluşturma veya yeniden derleme işlemleri gerçekleştirdiğinizde aşağıdaki yönergeler geçerlidir:

  • Dizin bakım pencerelerini yönetme, planlama ve genişletme üzerinde daha iyi denetime sahipsiniz. Dizin oluşturma veya yeniden derleme işlemini bakım pencerelerinize sığacak şekilde birkaç kez duraklatabilir ve yeniden başlatabilirsiniz.

  • Dizin oluşturma veya yeniden oluşturma hatalarından (veritabanı yük devretmeleri veya disk alanının bitmesi gibi) dizin işlemini baştan başlatmak zorunda kalmadan kurtarabilirsiniz.

  • Dizin işlemi duraklatıldığında, hem özgün dizin hem de yeni oluşturulan dizin disk alanı gerektirir ve DML işlemleri sırasında güncelleştirilmiş olması gerekir.

  • Bu SORT_IN_TEMPDB = ON seçenek desteklenmez.

  • Devre dışı bırakılan dizinler desteklenmez.

Tip

Devam edebilen dizin işlemleri büyük bir işlem gerektirmez; bu işlem sırasında sık sık günlük kesme işlemine izin verir ve büyük günlük büyümesini önler. Dizin işlemini sürdürmek ve tamamlamak için gereken veriler bir veritabanının veri dosyalarında depolanır.

Genel olarak, devam ettirilebilen ve yanıtlanamayan çevrimiçi dizin işlemleri arasında performans farkı yoktur. Devam ettirilebilir CREATE INDEX için, daha küçük tablolar için işlemleri belirgin şekilde yavaşlatabilecek sabit bir ek yük vardır.

Devam ettirilebilen dizin işlemi duraklatıldığında:

  • Çoğunlukla okunan iş yükleri için performans düşüşü önemsizdir.
  • Yoğun güncelleştirme içeren iş yükleri için iş yükü özelliklerine bağlı olarak bazı aktarım hızı düşüşü yaşayabilirsiniz.

Genel olarak, yeniden başlatılabilir ve yeniden başlatılamaz çevrimiçi dizin oluşturma veya yeniden oluşturma işlemleri arasında birleştirme kalitesi açısından fark yoktur.

Çevrimiçi dizin işlemi duraklatılırken, duraklatılmış dizini içeren tabloda tablo düzeyinde özel kullanım (X) kilidi gerektiren tüm işlemler başarısız olur. Örneğin, bu işlemlerle INSERT ... WITH (TABLOCK) oluşabilir. Bu durumda 10637 hatasını alırsınız:

Cannot perform this operation on '<object name>' with ID (<object ID>) as one or more indexes are currently in resumable index rebuild state. Please refer to sys.index_resumable_operations for more details.

10637 hatasını çözmek için, işleminizden "TABLOCK" ipucunu kaldırın veya dizin işlemini devam ettirip tamamlanmasını bekleyin ve daha sonra işleminizi tekrar deneyin.

Çevrimiçi varsayılan seçenekler

Çevrimiçi ve devam ettirilebilen dizin işlemlerini veritabanı düzeyinde varsayılan seçenekler olarak ayarlamak için ELEVATE_ONLINE veya ELEVATE_RESUMABLE veritabanı kapsamlı yapılandırmaları ayarlayabilirsiniz. Bu varsayılan seçeneklerle, çalışırken tablo veya dizine erişilemez hale getiren çevrimdışı dizin işlemini yanlışlıkla başlatmaktan kaçınabilirsiniz. Her iki seçenek de veritabanı altyapısının belirli dizin işlemlerini otomatik olarak çevrimiçi veya devam ettirilebilir yürütmeye yükseltmesine neden olur.

Seçeneklerden birini FAIL_UNSUPPORTED, WHEN_SUPPORTED veya OFF olarak ayarlayabilirsiniz. ELEVATE_ONLINE ve ELEVATE_RESUMABLE için farklı değerler ayarlayabilirsiniz. Daha fazla bilgi için bkz. ALTER DATABASE SCOPED CONFIGURATION.

Hem ELEVATE_ONLINE hem de ELEVATE_RESUMABLE yalnızca çevrimiçi ve sürdürülebilir söz dizimini sırasıyla destekleyen DDL deyimleri için geçerlidir. Örneğin, ELEVATE_ONLINE = FAIL_UNSUPPORTED ile bir XML dizini oluşturmayı denerseniz, XML dizini seçeneği desteklemediğinden ONLINE işlem çevrimdışı çalışır. Seçenekler yalnızca ONLINE veya RESUMABLE seçeneği belirtilmeden gönderilen DDL deyimlerini etkiler. Örneğin, ONLINE = OFF veya RESUMABLE = OFF ile bir ifade göndererek kullanıcı bir FAIL_UNSUPPORTED ayarını geçersiz kılabilir ve ifadeyi çevrimdışı veya yanıtsız çalıştırabilir.

Note

ELEVATE_ONLINE ve ELEVATE_RESUMABLE XML dizin işlemleri için geçerli değildir.