แบบสอบถามที่ใดที่จะตรวจสอบการเปรียบเทียบที่ง่ายกว่า (เช่นบิต) ก่อนที่จะทำการเปรียบเทียบที่ยากขึ้น (เช่น varchar)


12

ถ้าฉันเขียนแบบสอบถามที่มีWHEREคำสั่งผสมเช่น:

SELECT *
FROM MyTable
WHERE BitField = 1
    AND VarcharField = 'asdf'

และการรวมbitการเปรียบเทียบนั้นเพียงแค่แยกฟิลด์เดียวกันที่การvarcharเปรียบเทียบจะแยกออกการมีอยู่ของbitการเปรียบเทียบฟิลด์นั้นจะทำให้ฉันปรับปรุงประสิทธิภาพได้หรือไม่

คำตอบ:


22

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

แผนการดำเนินการทางกายภาพขั้นสุดท้ายจะขึ้นอยู่กับความสามารถในการใช้เหตุผลของเครื่องมือเพิ่มประสิทธิภาพจำนวนเวลาที่เตรียมไว้เพื่อใช้กับปัญหาความพร้อมใช้งานของวิธีการเข้าถึงที่เหมาะสม (ดัชนีหลักและมุมมองที่เป็นรูปธรรม) ข้อมูลสถิติตัวแทน ข้อกำหนดคุณสมบัติการสืบค้นจะใช้รหัสการปรับให้เหมาะสม

โดยทั่วไปหากการออกแบบฐานข้อมูลของคุณสัมพันธ์คุณให้วิธีการเข้าถึงที่ดีและข้อมูลทางสถิติที่ถูกต้องและแบบสอบถามนั้นเขียนได้ดีเครื่องมือเพิ่มประสิทธิภาพโดยทั่วไปจะพบกลยุทธ์การดำเนินการทางกายภาพที่สมเหตุสมผลโดยไม่ต้องกังวลเกี่ยวกับรูปแบบการเขียนของ ข้อกำหนดแบบสอบถามมากเกินไป

จะมีหลายกรณีที่แสดงความต้องการตรรกะเดียวกันโดยใช้ไวยากรณ์ที่แตกต่างกัน (แต่เหมือนกันในเชิงความหมาย) จะมีผลต่อแผนการดำเนินการทางกายภาพ แต่ควรเป็นข้อกังวลที่สอง โดยทั่วไปให้พิจารณาเฉพาะการแสดงแบบสอบถามที่แตกต่างกันหากลักษณะของรันไทม์ไม่สามารถยอมรับได้เมื่อมีการครอบคลุมพื้นฐานทั้งหมดที่กล่าวถึงข้างต้นแล้ว

มันจะหายากในสุดขีดสำหรับคำสั่งเขียนของWHEREประโยคประโยคที่เชื่อมต่ออย่างง่าย(ดังในคำถาม) ที่จะส่งผลกระทบต่อแผนปฏิบัติการทางกายภาพในลักษณะใด ๆ ที่วัดได้ ในระยะสั้นนี่ไม่ใช่สิ่งที่คุณควรใช้เวลากังวล รับการออกแบบฐานข้อมูลดัชนีและข้อมูลสถิติก่อน

ในการตอบคำถามโดยตรง (ในที่สุด!) การเพิ่มเงื่อนไขซ้ำซ้อนอาจช่วยเพิ่มประสิทธิภาพ แต่ถ้าใช้วิธีการเข้าถึงที่มีประสิทธิภาพมากขึ้นตัวอย่างเช่นหากมีเพียงดัชนีใน (BitField, VarcharField) หากมีดัชนีอยู่แล้ว (VarcharField) ก็จะเพิ่มเฉพาะค่าใช้จ่าย

ในฐานะที่เป็นรายละเอียดการใช้งานไม่ใช่ SQL Server ไม่พิจารณาค่าใช้จ่ายในการเปรียบเทียบขึ้นอยู่กับชนิดข้อมูลหรือความซับซ้อนในการคำนวณที่ชัดเจน ในความเป็นจริงมีค่าใช้จ่ายเล็กน้อยของการดำเนินงานเซนต์คิตส์และเนวิสแต่สิ่งที่นำไปสู่หัวข้อที่แยกต่างหากทั้งหมด

คำถามที่เกี่ยวข้อง:

ตัวดำเนินการทางตรรกะหรือและในสภาพและลำดับของเงื่อนไขใน WHERE
SQL Server 2008 และนิพจน์ค่าคงที่
ตัวดำเนินการ Bitwise ที่ส่งผลต่อประสิทธิภาพ
แปลกพฤติกรรมคำชี้แจง SQL


5

พาร์ทิชันแบบไบนารี (เช่นคอลัมน์บิต) ให้เสียงเหมือนตัวเลือกที่ดีสำหรับดัชนีที่ถูกกรอง

CREATE NONCLUSTERED INDEX MyTableWithBitFieldTrue
ON MyTable (VarcharField)
INCLUDE Id, <other columns you're selecting>
WHERE BitField = 1 ;
GO

ความชัดเจนเกี่ยวกับการเพิ่มประสิทธิภาพของคุณหมายความว่ารหัสของคุณแข็งแกร่งกว่าการเปลี่ยนแปลงของผู้อื่นไม่ว่าจะใน codebase ของคุณหรือใน SQL Server

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