ฉันคิดเรื่องนี้เมื่อหลายวันก่อนหลังจากการปรับให้เหมาะสมของ SQL ฉันคิดว่าเราสามารถตกลงกันได้ว่า SQL เป็น "ภาษาที่ประกาศ" ในคำจำกัดความของ Wikipedia:
กระบวนทัศน์การเขียนโปรแกรมที่แสดงออกถึงตรรกะของการคำนวณโดยไม่ต้องอธิบายการไหลของการควบคุม
หากคุณคิดว่ามีกี่สิ่งที่ต้องทำหลังม่าน (ดูสถิติการตัดสินใจว่าดัชนีมีประโยชน์หรือไม่การเข้าร่วมซ้อนหรือรวมแฮช ฯลฯ เป็นต้น) เราต้องยอมรับว่าเราให้ระดับสูง ตรรกะและฐานข้อมูลดูแลตรรกะการไหลของการควบคุมระดับต่ำทั้งหมด
นอกจากนี้ในสถานการณ์นี้บางครั้งเครื่องมือเพิ่มประสิทธิภาพฐานข้อมูลต้องการ "คำแนะนำ" จากผู้ใช้เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด
คำจำกัดความทั่วไปของภาษา "ที่เปิดเผย" คือ (ฉันไม่สามารถหาแหล่งข้อมูลที่มีสิทธิ์ได้):
กระบวนทัศน์การเขียนโปรแกรมที่แสดงออกถึงผลลัพธ์ที่ต้องการของการคำนวณโดยไม่ต้องอธิบายขั้นตอนเพื่อให้บรรลุผล (เช่นเดียวกับ "อธิบายสิ่งที่ไม่ใช่วิธี")
หากเรายอมรับคำจำกัดความนี้เราจะพบปัญหาที่อธิบายโดย OP
ปัญหาแรกคือ SQL ให้วิธีการเทียบเท่าหลายวิธีในการกำหนด "ผลลัพธ์เดียวกัน" อาจเป็นความชั่วร้ายที่จำเป็น: ยิ่งพลังการแสดงออกที่เราให้กับภาษามากเท่าไหร่ก็ยิ่งมีแนวโน้มที่จะมีวิธีที่แตกต่างกันในการแสดงออกในสิ่งเดียวกัน
ตัวอย่างเช่นฉันได้รับการขอให้หนึ่งครั้งเพื่อเพิ่มประสิทธิภาพการค้นหานี้:
SELECT Distinct CT.cust_type, ct.cust_type_description
from customer c
INNER JOIN
Customer_type CT on c.cust_type=ct.cust_type;
เนื่องจากประเภทมีน้อยกว่าลูกค้ามากและมีดัชนีในcust_type
ตารางลูกค้าฉันจึงประสบความสำเร็จในการปรับปรุงอย่างมากโดยเขียนใหม่เป็น:
SELECT CT.cust_type, ct.cust_type_description
from Customer_type CT
Where exists ( select 1 from customer c
Where c.cust_type=ct.cust_type);
ในกรณีเฉพาะนี้เมื่อฉันถามผู้พัฒนาสิ่งที่เขาต้องการบรรลุเขาบอกฉันว่า "ฉันต้องการลูกค้าทุกประเภทที่ฉันมีลูกค้าอย่างน้อยหนึ่งราย" นั่นก็คือคำอธิบายเครื่องมือเพิ่มประสิทธิภาพสามารถอธิบายได้อย่างบังเอิญ
ดังนั้นหากฉันสามารถค้นหาข้อความค้นหาที่เทียบเท่าและมีประสิทธิภาพมากกว่าได้ทำไมเครื่องมือเพิ่มประสิทธิภาพไม่สามารถทำเช่นเดียวกันได้
การเดาที่ดีที่สุดของฉันคือมันมีสองเหตุผลหลัก
SQL แสดงตรรกะ:
เนื่องจาก SQL แสดงตรรกะระดับสูงเราจะต้องการเครื่องมือเพิ่มประสิทธิภาพเพื่อ "เอาชนะ" เราและตรรกะของเราหรือไม่ ฉันจะตะโกนอย่างกระตือรือร้นว่า "ใช่" ถ้าไม่ใช่ทุกครั้งที่ฉันต้องบังคับให้เครื่องมือเพิ่มประสิทธิภาพเลือกเส้นทางการดำเนินการที่มีประสิทธิภาพที่สุด ฉันคิดว่าความคิดอาจช่วยให้เครื่องมือเพิ่มประสิทธิภาพทำได้ดีที่สุด (แก้ไขตรรกะของเราด้วย) แต่ให้ "กลไกคำใบ้" เพื่อช่วยเหลือเมื่อมีอะไรบางอย่างบ้าคลั่ง (เหมือนมีล้อ + เบรกอยู่ใน รถอิสระ)
ทางเลือกมากขึ้น = เวลามากขึ้น
แม้แต่เครื่องมือเพิ่มประสิทธิภาพ RDBMS ที่ดีที่สุดยังไม่ทดสอบเส้นทางการประมวลผลที่เป็นไปได้ทั้งหมดเนื่องจากต้องรวดเร็วมาก: การเพิ่มประสิทธิภาพการสืบค้นจาก 100ms ถึง 10ms เป็นอย่างไรถ้าฉันต้องใช้ทุกครั้งที่เลือกเส้นทางที่ดีที่สุด 100ms และนั่นคือโปรแกรมเพิ่มประสิทธิภาพที่ใช้ "ตรรกะระดับสูง" ของเรา หากควรทดสอบแบบสอบถาม SQL ที่เทียบเท่าทั้งหมดด้วยเวลาที่เครื่องมือเพิ่มประสิทธิภาพอาจเพิ่มขึ้นหลายครั้ง
อีกตัวอย่างที่ดีของการเขียนแบบสอบถามที่ไม่มี RDBMS จริง ๆ แล้วสามารถทำได้คือ (จากโพสต์บล็อกที่น่าสนใจนี้ )
SELECT t1.id, t1.value, SUM(t2.value)
FROM mytable t1
JOIN mytable t2
ON t2.id <= t1.id
GROUP BY t1.id, t1.value;
เกินกว่าจะเขียนได้เช่นนี้ (จำเป็นต้องใช้ฟังก์ชั่นการวิเคราะห์)
SELECT id, value, SUM(t1.value) OVER (ORDER BY id)
FROM mytable
select whatever from sometable where FKValue in (select FKValue from sometable_2 where other_value = :param)
. มันควรจะเป็นที่น่ารำคาญเพื่อดูวิธีการย้ำว่ากับหรือexists
join