ข้อใดข้อหนึ่งต่อไปนี้เร็วกว่า (เช่น 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 ' ฉันยังไม่ได้ลองเลย