SQL Server Tam Metin Dizini'ni etkinleştirdikten sonra sorguları yavaşlatma


10

Benim veritabanına karşı çalışan birçok ekleme, güncelleme ve silme sorguları ile bir asp.net web sitesi var.

Birkaç gün önce tablolardan birinin iki sütununda bir Tam Metin Dizini oluşturuyorum. Bundan sonra, web sitesi bu tabloda güncelleme sorguları çalıştırdığında, SQL Server İşleminin bellek ve disk kullanımının atladığını ve güncellemelerin daha yavaş olduğunu fark ettim. Sorgular, Tam Metin dizini oluşturmadan önce herhangi bir performans sorunu olmadan çalıştırıldı.

Ayrıca, yürütme planının Tam Metin dizini güncellemesi gibi şeyler olduğu için, daha önce çok basit olan güncelleme sorgularının artık karmaşık olduğunu fark ettim. Bu, Tam Metin etkinleştirildikten sonra karmaşık hale gelen yeni bir yürütme planının bir parçasıdır:

resim açıklamasını buraya girin

Site içeriğini güncellediğim birkaç saat içinde 5000 güncelleme sorgusu çalıştırdım ve her satır için her seferinde tam metin dizinleme işleminin yapıldığını düşünüyorum.

Satırları güncellemeye başladıktan sonra tam metin taramayı devre dışı bırakmalı ve sonra yeniden etkinleştirmeli miyim ( bu ilgili sorudaki gibi )?

SQL Server'a tam metin dizine eklemeyi 5 dakika boyunca durdurmasını ve ardından yeni verileri dizine eklemeyi başlatabilir miyim?

Daha iyi bir alternatif var mı? SQL Server 2012 kullanıyorum.

Yanıtlar:


2

Benim durumumda verimsiz bir UPDATE deyimini değiştirmek zorunda kaldım:

Önce:

UPDATE Customer 
SET Rating = 'Not Rated'
WHERE ...

Sonra:

UPDATE Customer
SET Rating = 'Not Rated'
WHERE ...
AND Rating <> 'Not Rated' -- THIS LINE WAS INSERTED

Bu performansı 4 dakikadan 5 saniyeye çıkardı. Sorun, atamak istediğim değere sahip olsalar bile, tüm satırları güncellememdi.


1

Durdurursanız (devre dışı bırakırsanız), dizini kullanan sorgular için kullanılamaz.

Ancak değişiklik izlemeyi manuel olarak ayarlayabilirsiniz:

--disable automatic change tracking
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING MANUAL
GO

--run the update statement here

--re-enable automatical change tracking after updating it to reflect the recent changes
ALTER FULLTEXT INDEX schema.table START UPDATE POPULATION
GO
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING AUTO
GO

Geçerli değeri şu sorgu ile kontrol edebilirsiniz:

SELECT TOP(10) change_tracking_state_desc, * 
FROM sys.fulltext_indexes 
WHERE object_name(object_id) = '...';

Geçerli seçenekler: SET CHANGE_TRACKING {MANUAL | AUTO | OFF}

Tam metin dizini tarafından kapsanan tablo sütunlarında yapılan değişikliklerin (güncelleştirmeler, siler veya ekler) SQL Server tarafından tam metin dizinine yayılıp yayılmayacağını belirtir. Veriler değişir WRITETEXTve UPDATETEXTtam metin dizinine yansıtılmaz ve değişiklik izleme ile alınmaz.

ALTER FULLTEXT INDEX (Transact-SQL) için Microsoft belgelerine bakın .

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.