เข้าร่วม SQL Server / สถานที่ประมวลผลคำสั่ง


18

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

ตัวอย่างควร:

SELECT *
FROM   ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2

จะดีกว่า / เร็วกว่า:

SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val

ทฤษฎีของฉันมีดังต่อไปนี้ (นี่อาจไม่เป็นการใช้งานที่ถูกต้องฉันพยายามจดจำจากหนังสือ internals SQL Server 2008 ที่ฉันอ่าน (MSFT Press)):

  1. ตัวประมวลผลแบบสอบถามได้รับตารางด้านซ้ายก่อน (ตารางที่ 1)
  2. เข้าร่วมตารางที่สอง (ตารางที่ 2) และสร้างผลิตภัณฑ์คาร์ทีเซียนก่อนกรองแถวที่จำเป็น (ถ้ามี)
  3. จากนั้นดำเนินการตามคำสั่ง WHERE, GROUP BY, HAVING โดยใช้คำสั่ง SEELCT

ดังนั้นหากในคำสั่ง # 1 ด้านบนตารางมีขนาดเล็กกว่าเครื่องยนต์ SQL จะทำงานได้น้อยลงเมื่อสร้างผลิตภัณฑ์คาร์ทีเซียน จากนั้นเมื่อคุณไปถึงคำสั่ง where คุณจะมีชุดผลลัพธ์ที่ลดลงซึ่งจะกรองในหน่วยความจำ

ฉันอาจจะห่างไกลจากเครื่องหมายมันไม่จริง อย่างที่ฉันพูดมันเป็นทฤษฎี

ความคิดของคุณ?

หมายเหตุ : ฉันแค่คิดถึงคำถามนี้และยังไม่มีโอกาสทดสอบตนเองเลย

หมายเหตุ 2 : ติดแท็กเป็น SQL Server เนื่องจากฉันไม่รู้อะไรเลยเกี่ยวกับการใช้ MySql เป็นต้นโปรดตอบ / แสดงความคิดเห็นต่อไป

คำตอบ:


15

การประมวลผลแบบลอจิคัลของแบบสอบถามอยู่ในMSDN (เขียนโดยทีม Microsoft SQL Server ไม่ใช่บุคคลที่สาม)

1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE or WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP

ตารางที่ได้รับตามนี้แล้วแบบสอบถามด้านนอกทำอีกครั้ง ฯลฯ ฯลฯ

นี่คือตรรกะว่า: ไม่ได้เกิดขึ้นจริง ไม่ว่า SQL Server จริงไม่ได้ความหมายเหล่านี้จะได้รับเกียรติไปยังตัวอักษร "ของจริง" จะถูกกำหนดโดยเครื่องมือเพิ่มประสิทธิภาพข้อความค้นหา (QO) และคุณหลีกเลี่ยงผลิตภัณฑ์คาร์ทีออนระดับกลางที่คุณกล่าวถึง

เป็นมูลค่าการกล่าวถึงว่า SQL เป็นประกาศ: คุณพูดว่า "อะไร" ไม่ "อย่างไร" เช่นคุณสำหรับการเขียนโปรแกรมขั้นตอน / ความจำเป็น (Java, .net) ดังนั้นการพูดว่า "สิ่งนี้เกิดขึ้นก่อนหน้านั้น" ผิดในหลาย ๆ กรณี (เช่นการสันนิษฐานวงจรสั้นหรือคำสั่ง L-to-R WHERE)

ในกรณีของคุณด้านบน QO จะสร้างแผนเดียวกันไม่ว่ามันจะมีโครงสร้างอย่างไรเพราะมันเป็นคำถามง่ายๆ

อย่างไรก็ตาม QO นั้นใช้ต้นทุนและสำหรับแบบสอบถามที่ซับซ้อนอาจใช้เวลา 2 สัปดาห์ในการสร้างแผนในอุดมคติ ดังนั้นมันจึง "ดีพอ" ซึ่งจริงๆแล้วไม่ใช่

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

ฉันใช้เคล็ดลับนี้กับ SQL Server 2000 เพื่อเพิ่มประสิทธิภาพความเร็ว 60x สำหรับการรายงานการสืบค้น ในขณะที่ QO ปรับปรุงรุ่นให้เป็นเวอร์ชั่นที่ดีขึ้นทำให้สิ่งต่าง ๆ เหล่านี้ดีขึ้น

และหนังสือที่คุณพูดถึง: มีข้อโต้แย้งบางอย่างเกี่ยวกับมัน
ดู SO และลิงก์ที่ตามมา: /programming//q/3270338/27535


6

แบบสอบถาม SQL ไม่ใช่ขั้นตอนในลักษณะไม่มีการประมวลผลตัวดำเนินการรวมถึงบนลงล่าง การเรียงลำดับของตารางในคิวรีตัวอย่างของคุณไม่มีผลต่อแผนการดำเนินการตามที่เทียบเท่ากับเหตุผลและจะสร้างแผนเดียวกัน

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

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

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

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