การใช้ตรรกะไม่เกี่ยวกับดัชนี


12

ตามหนังสือของ Microsoft เกี่ยวกับการพัฒนาฐานข้อมูลข้อสอบ 70-433:การพัฒนาฐานข้อมูลMicrosoft SQL Server 2008 :

อักขระตัวแทนที่ไม่ใช่ตัวอักษรไม่ใช่ตรรกะอนุญาตให้เครื่องมือเพิ่มประสิทธิภาพคิวรีใช้ดัชนีเพื่อเพิ่มประสิทธิภาพการค้นหา เพื่อประสิทธิภาพสูงสุดคุณควรหลีกเลี่ยงการใช้ไม่คำหลักและนำสัญลักษณ์สัญลักษณ์แทน

ดังนั้นฉันจึงเป็นแบบNOT INนั้นNOT EXISTSเป็นต้น

ขณะนี้เกี่ยวกับคำถามSOนี้ฉันคิดว่าโซลูชันที่เลือกโดย @GBN จะละเมิดคำแถลงที่ระบุไว้ด้านบน

เห็นได้ชัดว่ามันไม่ได้

ดังนั้นคำถามของฉันคือ: ทำไม

คำตอบ:


21
  • NOT IN (SELECT ...)และNOT EXISTS (SELECT .. WHERE correlation..)เป็น "Anti Semi Joins" นั่นคือการดำเนินการตามชุดที่ได้รับการยอมรับ

  • WHERE NOT (MyColumn = 1) เป็นตัวกรองที่ต้องใช้ดูแถวทั้งหมด

สำหรับข้อมูลเพิ่มเติมดู:

แก้ไข: เพื่อความสมบูรณ์

ซ้ายเข้าร่วมมักจะทำงานแย่ลง ดูhttp://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server

ไซต์เดียวกันนี้ตั้งข้อสังเกตว่าใน MySQL ไม่ใช่ EXISTS ที่ไม่ได้รับการปรับให้เหมาะสมเหมือนกับ RDBMS และ LEFT JOIN อื่น ๆ จะดีกว่า

ใน SQL Server ฉันรู้จากประสบการณ์ที่ LEFT JOIN ไม่ทำงานเช่นเดียวกับ EXISTS คุณมักต้องการ DISTINCT เพื่อให้ได้ผลลัพธ์เดียวกันกับขั้นตอนการประมวลผลอื่น


0

ฉันใช้ตัวเลือกย่อยสำหรับสิ่งนี้:

SELECT m* from Main AS m 
    WHERE m.id NOT IN 
        (SELECT m2.id FROM Main AS m2 
           WHERE m2.id IN (...possibly null/empty list goes here...));

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

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