Memperbarui kueri lebih lambat setelah mengaktifkan SQL Server Full-Text Index

10

Saya memiliki situs web asp.net dengan banyak menyisipkan, memperbarui, dan menghapus kueri yang berjalan terhadap basis data saya.

Beberapa hari yang lalu saya membuat Indeks Teks Lengkap pada dua kolom dari satu tabel. Setelah itu saya menyadari bahwa ketika situs web menjalankan kueri pembaruan pada tabel itu, penggunaan memori dan disk Proses SQL Server melonjak dan pembaruan lebih lambat. Kueri berjalan tanpa masalah kinerja sebelum membuat indeks Teks Lengkap.

Saya juga menyadari bahwa permintaan pembaruan yang sebelumnya sangat sederhana, sekarang rumit, karena rencana eksekusi sekarang memiliki hal-hal seperti pembaruan indeks Teks Lengkap. Ini adalah bagian dari rencana eksekusi baru yang menjadi rumit setelah mengaktifkan Teks Lengkap:

masukkan deskripsi gambar di sini

Dalam beberapa jam ketika saya memperbarui konten situs, saya menjalankan 5.000 permintaan pembaruan dan saya pikir proses pengindeksan teks lengkap dilakukan setiap kali untuk setiap baris.

Haruskah saya menonaktifkan pemindaian teks penuh saat mulai memperbarui baris dan kemudian mengaktifkannya kembali (seperti dalam pertanyaan terkait ini )?

Dapatkah saya memberi tahu SQL Server untuk menghentikan pengindeksan teks lengkap selama 5 menit dan kemudian mulai mengindeks data baru?

Apakah ada alternatif yang lebih baik? Saya menggunakan SQL Server 2012.

Mohammad Ha
sumber

Jawaban:

2

Dalam kasus saya, saya harus mengubah pernyataan UPDATE yang tidak efisien:

Sebelum:

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

Setelah:

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

Ini meningkatkan kinerja dari 4 menit menjadi 5 detik. Masalahnya adalah saya biasa memperbarui semua baris, bahkan jika mereka sudah memiliki nilai yang ingin saya tetapkan.

Fabian
sumber
1

Jika Anda menghentikannya (nonaktifkan), indeks tidak akan tersedia untuk permintaan menggunakannya.

Namun, Anda dapat mengatur pelacakan perubahan ke manual:

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

Anda dapat memeriksa nilai saat ini dengan kueri ini:

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

Opsi yang valid adalah: SET CHANGE_TRACKING {MANUAL | AUTO | OFF}

Menentukan apakah perubahan (pembaruan, penghapusan, atau menyisipkan) yang dibuat untuk kolom tabel yang dicakup oleh indeks teks lengkap akan disebarkan oleh SQL Server ke indeks teks lengkap. Perubahan data melalui WRITETEXTdan UPDATETEXTtidak tercermin dalam indeks teks lengkap, dan tidak diambil dengan pelacakan perubahan.

Lihat dokumentasi Microsoft untuk ALTER FULLTEXT INDEX (Transact-SQL) .

Julien Vavasseur
sumber