JonH ได้กล่าวถึงวิธีการเขียนแบบสอบถามเป็นอย่างดี อย่างไรก็ตามมีปัญหาสำคัญอีกประการหนึ่งที่ต้องกล่าวถึงเช่นกันซึ่งเป็นลักษณะการทำงานของข้อความค้นหาดังกล่าว ขอย้ำที่นี่ (ปรับให้เข้ากับ Oracle):
SELECT EmployeeName FROM EmployeeTable WHERE LENGTH(EmployeeName) > 4;
แบบสอบถามนี้ จำกัดผลลัพธ์ของฟังก์ชันที่ใช้กับค่าคอลัมน์ (ผลของการใช้LENGTH
ฟังก์ชันกับEmployeeName
คอลัมน์) ใน Oracle และอาจอยู่ใน RDBMS อื่น ๆ ทั้งหมดนั่นหมายความว่าดัชนีปกติใน EmployeeName จะไม่มีประโยชน์ในการตอบคำถามนี้ ฐานข้อมูลจะทำการสแกนแบบเต็มตารางซึ่งอาจมีค่าใช้จ่ายสูงมาก
อย่างไรก็ตามฐานข้อมูลต่างๆมีคุณลักษณะดัชนีฟังก์ชันที่ออกแบบมาเพื่อเร่งความเร็วในการสืบค้นข้อมูลเช่นนี้ ตัวอย่างเช่นใน Oracle คุณสามารถสร้างดัชนีดังนี้:
CREATE INDEX EmployeeTable_EmployeeName_Length ON EmployeeTable(LENGTH(EmployeeName));
อย่างไรก็ตามสิ่งนี้อาจยังไม่ช่วยในกรณีของคุณเนื่องจากดัชนีอาจไม่ได้รับการคัดเลือกให้เหมาะกับสภาพของคุณมากนัก ตามนี้ฉันหมายถึงสิ่งต่อไปนี้คุณกำลังถามหาแถวที่ความยาวของชื่อมากกว่า 4 สมมติว่า 80% ของชื่อพนักงานในตารางนั้นยาวกว่า 4 จากนั้นฐานข้อมูลก็น่าจะสรุปได้ ( ถูกต้อง) ว่ามันไม่คุ้มที่จะใช้ดัชนีเพราะมันอาจจะต้องอ่านบล็อคส่วนใหญ่ในตารางอยู่ดี
อย่างไรก็ตามหากคุณเปลี่ยนข้อความค้นหาเพื่อพูดLENGTH(EmployeeName) <= 4
หรือLENGTH(EmployeeName) > 35
สมมติว่ามีพนักงานเพียงไม่กี่คนที่มีชื่อที่มีอักขระน้อยกว่า 5 ตัวหรือมากกว่า 35 ตัวดัชนีจะถูกเลือกและปรับปรุงประสิทธิภาพ
อย่างไรก็ตามในระยะสั้น: ระวังลักษณะการทำงานของข้อความค้นหาเช่นเดียวกับที่คุณพยายามเขียน
AND
คำสั่งเช่นSELECT city FROM student.zipcode WHERE LENGTH(city) >= 4 AND LENGTH(city) <= 9;