ปรับปรุงคิวรีช้าลงหลังจากเปิดใช้งานดัชนีข้อความแบบเต็มของเซิร์ฟเวอร์ SQL


10

ฉันมีเว็บไซต์ asp.net ที่มีการแทรกอัปเดตและลบคิวรีที่เรียกใช้กับฐานข้อมูลของฉันมากมาย

ไม่กี่วันที่ผ่านมาฉันสร้างดัชนีข้อความแบบเต็มในสองคอลัมน์ของหนึ่งในตาราง หลังจากนั้นฉันก็รู้ว่าเมื่อเว็บไซต์รันคิวรีการอัพเดตบนตารางนั้นการใช้หน่วยความจำและดิสก์ของกระบวนการเซิร์ฟเวอร์ SQL กำลังกระโดดและการอัปเดตช้าลง แบบสอบถามทำงานโดยไม่มีปัญหาประสิทธิภาพใด ๆ ก่อนสร้างดัชนีข้อความแบบเต็ม

ฉันยังตระหนักว่าแบบสอบถามแบบใช้ปรับปรุงที่ง่ายมากมาก่อนตอนนี้มีความซับซ้อนเนื่องจากแผนการดำเนินการในขณะนี้มีสิ่งต่าง ๆ เช่นการปรับปรุงดัชนีข้อความแบบเต็ม นี่เป็นส่วนหนึ่งของแผนการดำเนินการใหม่ที่ซับซ้อนหลังจากเปิดใช้งานข้อความแบบเต็ม:

ป้อนคำอธิบายรูปภาพที่นี่

ในบางชั่วโมงเมื่อฉันอัปเดตเนื้อหาของไซต์ฉันเรียกใช้คิวรีการอัปเดต 5,000 รายการและฉันคิดว่ากระบวนการจัดทำดัชนีข้อความแบบเต็มจะทำในแต่ละครั้งสำหรับแต่ละแถว

ฉันควรจะปิดการใช้งานการสแกนข้อความเต็มในการเริ่มต้นของการปรับปรุงแถวและจากนั้นอีกครั้งเปิดใช้งานได้ (ในขณะที่คำถามที่เกี่ยวข้องนี้ )?

ฉันสามารถบอกให้ SQL Server หยุดจัดทำดัชนีข้อความแบบเต็มเป็นเวลา 5 นาทีแล้วเริ่มสร้างดัชนีข้อมูลใหม่ได้หรือไม่

มีทางเลือกที่ดีกว่านี้อีกไหม? ฉันใช้ SQL Server 2012

คำตอบ:


2

ในกรณีของฉันฉันต้องเปลี่ยนคำสั่ง UPDATE ที่ไม่มีประสิทธิภาพ:

ก่อน:

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

หลังจาก:

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

ปรับปรุงประสิทธิภาพจาก 4 นาทีลงเป็น 5 วินาที ปัญหาคือฉันเคยอัปเดตแถวทั้งหมดแม้ว่าพวกเขาจะมีค่าที่ฉันต้องการมอบหมายแล้ว


1

หากคุณหยุด (ปิดการใช้งาน) ดัชนีจะไม่สามารถใช้การสืบค้นได้

อย่างไรก็ตามคุณสามารถตั้งค่าการติดตามการเปลี่ยนแปลงด้วยตนเองได้:

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

คุณสามารถตรวจสอบค่าปัจจุบันด้วยแบบสอบถามนี้:

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

ตัวเลือกที่ถูกต้องคือ: SET CHANGE_TRACKING {MANUAL | AUTO | OFF}

ระบุว่าการเปลี่ยนแปลง (อัพเดตลบหรือแทรก) ที่เกิดขึ้นในคอลัมน์ตารางที่ครอบคลุมโดยดัชนีข้อความแบบเต็มจะถูกเผยแพร่โดย SQL Server ไปยังดัชนีข้อความแบบเต็ม ข้อมูลมีการเปลี่ยนแปลงWRITETEXTและUPDATETEXTไม่สะท้อนในดัชนีข้อความแบบเต็มและไม่ได้รับพร้อมกับการติดตามการเปลี่ยนแปลง

โปรดดูเอกสารของ Microsoft สำหรับALTER FULLTEXT INDEX (Transact SQL)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.