ข้อใดข้อหนึ่งต่อไปนี้เร็วกว่า (เช่น vs CONTAINS)
SELECT * FROM table WHERE Column LIKE '%test%';
หรือ
SELECT * FROM table WHERE Contains(Column, "test");
ข้อใดข้อหนึ่งต่อไปนี้เร็วกว่า (เช่น vs CONTAINS)
SELECT * FROM table WHERE Column LIKE '%test%';
หรือ
SELECT * FROM table WHERE Contains(Column, "test");
คำตอบ:
ที่สอง (สมมติว่าคุณหมายถึงCONTAINSและจริง ๆ แล้วใส่ไว้ในแบบสอบถามที่ถูกต้อง) ควรจะเร็วกว่าเพราะสามารถใช้ดัชนีบางรูปแบบ (ในกรณีนี้คือดัชนีข้อความแบบเต็ม) แน่นอนแบบสอบถามรูปแบบนี้จะใช้ได้เฉพาะเมื่อคอลัมน์อยู่ในดัชนีข้อความแบบเต็ม หากไม่เป็นเช่นนั้นจะมีเพียงแบบฟอร์มแรกเท่านั้น
แบบสอบถามแรกที่ใช้ LIKE จะไม่สามารถใช้ดัชนีได้เนื่องจากเริ่มต้นด้วย wildcard ดังนั้นจะต้องใช้การสแกนแบบเต็มตารางเสมอ
CONTAINSแบบสอบถามควรจะ:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINSหรือไม่ มันคืออะไร รูปแบบดั้งเดิมของคำถามมีColumn CONTAIN("%test%",Column)>0ซึ่งไม่มีที่ไหนใกล้กับที่ถูกต้อง มันยังไม่ถูกต้องสมบูรณ์
มีการเรียกใช้แบบสอบถามทั้งสองบนอินสแตนซ์ของ SQL Server 2012 ฉันสามารถยืนยันแบบสอบถามแรกได้เร็วที่สุดในกรณีของฉัน
แบบสอบถามที่มีLIKEคำหลักแสดงการสแกนดัชนีแบบคลัสเตอร์
CONTAINSยังมีสแกนดัชนีคลัสเตอร์กับผู้ประกอบการที่เพิ่มขึ้นสำหรับการแข่งขันข้อความเต็มรูปแบบและผสานเข้าร่วม

LIKEแบบสอบถามกับตัวแทนชั้นนำจะไม่สามารถที่จะใช้เป็นส่วนหนึ่งของดัชนีได้อย่างมีประสิทธิภาพ มันจะต้องเพียงแค่สแกนสิ่งทั้งหมด ในขณะที่ไม่ต้องสงสัยเลยว่าอาจมีบางสถานการณ์ที่การสแกนแบบ CI เต็มประสิทธิภาพดีกว่าการสืบค้นโดยใช้ดัชนีข้อความแบบเต็ม (บางทีถ้าสัดส่วนของแถวที่ตรงกับตัวอย่างที่สูงมาก) สิ่งนี้จะเป็นข้อยกเว้นที่ไม่ใช่กฎทั่วไปบางอย่างสำหรับคุณ "
LIKEและยังไม่ได้มีการประเมิน
ผมคิดว่าCONTAINSใช้เวลานานและใช้Mergeเพราะคุณมีขีดกลาง ( "-") adventure-works.comในการค้นหาของคุณ
เครื่องหมายขีดกลางเป็นคำหยุดดังนั้นการCONTAINSค้นหาดัชนีข้อความแบบเต็มadventureและมากกว่าที่ค้นหาworks.comและผสานผลลัพธ์
ลองเปลี่ยนจากนี้:
SELECT * FROM table WHERE Contains(Column, "test") > 0;
สำหรับสิ่งนี้:
SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
อดีตจะค้นหาระเบียนที่มีค่าเช่น " นี่คือการทดสอบ " และ " กรณีทดสอบคือแผน "
หลังจะพบระเบียนที่มีค่าเช่น " ฉันกำลังทดสอบนี้ " และ " นี่คือสิ่งที่ยิ่งใหญ่ที่สุด "
CONTAINSกล่าวถึงเฉพาะการใช้คำนำหน้าเช่น 'test *' ไม่ใช่คำต่อท้ายเช่น ' test' และไม่ค้นหาซับสตริงแบบเต็มเช่น '* test ' ฉันยังไม่ได้ลองเลย