ประสิทธิภาพของขั้นตอนการจัดเก็บเทียบกับแบบสอบถามแบบดิบ


23

ฉันได้อ่านมากทั้งสองด้านของการอภิปรายนี้: มีประสิทธิภาพที่มีนัยสำคัญที่จะได้รับโดยใช้วิธีการที่เก็บไว้เฉพาะกับแบบสอบถามแบบดิบหรือไม่ ฉันสนใจ SQL Server โดยเฉพาะ แต่จะสนใจในฐานข้อมูลใด ๆ และทั้งหมด


2
คุณสามารถโพสต์ลิงก์ไปยังสิ่งที่คุณอ่านหรือไม่? ฉันไม่คิดว่าการแสดงจะตกอยู่ที่นี่ (อย่างน้อยก็ไม่ได้โดยตรง)
แจ็คดักลาส

1
@JackDouglas ดูคำตอบของ mrdenny ประสิทธิภาพเป็นส่วนหนึ่งของคำถาม / คำตอบนี้มาก
Thomas Stringer

คำตอบ:


31

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

และอย่าลืมเกี่ยวกับปัญหาด้านความปลอดภัย (ไดนามิก SQL, สิทธิ์ขั้นต่ำและอื่น ๆ ) ที่หายไปเมื่อใช้กระบวนงานที่เก็บไว้

เมื่อแอปใช้ SQL แบบไดนามิกกับตารางฐานเพื่อเลือกแทรกอัปเดตและลบข้อมูลในตารางที่แอปพลิเคชันต้องมีสิทธิ์ในวัตถุเหล่านั้นทั้งหมดโดยตรง ดังนั้นหากใครบางคนใช้การฉีด SQL เพื่อเข้าสู่เซิร์ฟเวอร์พวกเขาจะมีสิทธิ์ในการสอบถามเปลี่ยนแปลงหรือลบข้อมูลทั้งหมดในตารางเหล่านั้น

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

เนื่องจากการฉีด SQL เป็นวิธีที่ง่ายที่สุดในการเจาะเข้าไปในฐานข้อมูลนี่เป็นสิ่งที่สำคัญ


@ mrdenny - คุณจะได้รับผลเช่นเดียวกันกับ "การสืบค้นข้อมูลดิบ" หากมีการกำหนดพารามิเตอร์หรือไม่
แจ็คดักลาส

ใช่ถ้าพวกเขาถูก parametrized อย่างเต็มที่ อย่างไรก็ตามนั่นไม่ได้แก้ไขปัญหาความปลอดภัยซึ่งได้รับการแก้ไขด้วยวิธีการจัดเก็บ
mrdenny

10

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

ในกรณีที่เลวร้ายที่สุดเมื่อเร็ว ๆ นี้ 8GB จัดสรรให้กับอินสแตนซ์แคชแผน 3GB, แผนการใช้งานเพียงครั้งเดียว 2.5GB ส่วนใหญ่เป็น SQL2005 ดังนั้นจึงไม่มีตัวเลือกให้ลองปรับการตั้งค่าภาระงานแบบแอดฮอค

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


มีบทความที่เกี่ยวข้องที่ดีที่นี่รวมถึงสคริปต์เพื่อลบแผนแบบใช้ครั้งเดียว sqlskills.com/blogs/kimberly/…
ซื้อบางส่วน

7

SQL Server จะแคชและปรับโพรซีเดอร์ที่เก็บไว้และ ad-hoc SQL ให้เหมาะสมในลักษณะเดียวกัน ตัวอย่างเช่นขั้นตอนนี้:

create procedure dbo.TestSB(@id int) as select * from Orders where id = @id

จะถูกออปติไมซ์และแคชเหมือนกันกับ:

select * from Orders where id = @id

อย่างไรก็ตาม ad-hoc SQL ต่อไปนี้ไม่สามารถแคชได้อย่างมีประสิทธิภาพเนื่องจากค่าฮาร์ดโค้ด:

select * from Orders where id = 42

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


+1 โดยเฉพาะอย่างยิ่งถ้าคุณบังคับให้ทุกคนเข้าถึง SP ของคุณและพวกเขาคิดว่าเป็นธุรกรรม API ไม่ใช่แค่ชั้น CRUD
Jack Douglas

ในปี 2008+ id = 42แบบสอบถามสามารถปรับให้เหมาะสมโดยใช้แผนเดียวกันทั้งนี้ขึ้นอยู่กับการตั้งค่าพารามิเตอร์ที่เรียบง่าย / ถูกบังคับ แน่นอนว่าควรมีการกำหนดพารามิเตอร์ของแบบสอบถามอย่างถูกต้อง :-)
Aaron Bertrand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.