วิธีเพิ่มประสิทธิภาพของ Virgin Query ใน MS SQL Server


10

ฉันมีเว็บไซต์ ASP.NET ที่เป็นเจ้าของแคชข้อมูลและข้อมูลไม่เปลี่ยนแปลงเป็นเวลานานดังนั้นจึงไม่จำเป็นต้องสืบค้น SQL Server ครั้งที่สองด้วยแบบสอบถามเดียวกัน ฉันต้องปรับปรุงประสิทธิภาพของแบบสอบถามครั้งแรก (บริสุทธิ์) ที่ไปยัง SQL Server นั้น แบบสอบถามบางแห่งประมวลผลข้อมูลมากจนอาจทำให้ SQL Server ใช้งานtempdbได้ ฉันไม่ใช้ตัวแปร temp table หรือ temp tables ดังนั้น SQL Server ตัดสินใจที่จะใช้tempdbด้วยตนเองทุกครั้งที่ต้องการ

ขนาดฐานข้อมูลของฉันคือ 16Gb ฉันมี RAM จริง 32Gb อยู่ในเครื่องเซิร์ฟเวอร์

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

ฉันคิดว่าเมื่อแบบสอบถามที่ต้องการเก็บบางสิ่งใน tempdb SQL Server มาและมี RAM ไม่เพียงพอ SQL Server มี 2 ตัวเลือก:

1) เพื่อยกเลิกการโหลดข้อมูลแคชและใช้ spared RAM แทน tempdb เพื่อหลีกเลี่ยงการเขียนดิสก์

2) เก็บข้อมูลที่แคชไว้สำหรับการสืบค้นในอนาคตและเริ่มใช้ tempdb ซึ่งทำให้การเขียนลงดิสก์ช้า

ฉันไม่รู้ว่า SQL Server ตัวเลือกใดที่จะทำให้ในสถานการณ์นี้ แต่ฉันต้องการเลือก # 1 เพราะฉันสนใจเฉพาะประสิทธิภาพของแบบสอบถามครั้งแรก (บริสุทธิ์) เนื่องจากฉันไม่เคยส่งแบบสอบถามเดียวกันไปยัง SQL Server อีก (แม้ว่าฉันอาจส่งข้อความค้นหาที่คล้ายกัน)

กลยุทธ์การแคช SQL Server สำหรับสถานการณ์นี้คืออะไร

มันสมดุลการใช้ RAM ระหว่างการหลีกเลี่ยง tempdb สำหรับการสอบถามบริสุทธิ์และความเร็วของการสอบถามครั้งที่สองได้อย่างไร

เป็นไปได้หรือไม่ที่จะกำหนดค่า SQL Server ในแบบที่จะเลือก # 1 ถ้าใช่แล้วได้อย่างไร

ฉันจะเพิ่มประสิทธิภาพของการสืบค้น SQL บริสุทธิ์ทั้งหมดได้อย่างไร

เนื่องจากฉันไม่รู้เกี่ยวกับกลยุทธ์การแคช SQL Server ฉันต้องการวางฐานข้อมูลบน RAM Disk สิ่งนี้จะทำให้แน่ใจได้ว่าข้อความค้นหาใด ๆ ล้วนมีความเร็วสูงในการโหลดข้อมูลที่ไม่ถูกตรวจจับแม้ว่า SQL Server จะทำการเลือก # 1 เสมอ ความเสี่ยงของมันก็คือ SQL Server อาจเริ่มใช้ tempdb มากขึ้นกับ RAM ที่มีน้อย (เฉพาะ 16Gb เหลือหลังจากผมใช้ 16Gb สำหรับ RAM ดิสก์) ถ้ามันช่วยให้การเลือก # 2 tempdbซึ่งจะชะลอตัวลงคำสั่งบริสุทธิ์ผู้ที่ก่อให้เกิดการรั่วไหลเข้า

ฉันสนใจวิธีแก้ปัญหาสำหรับ SQL 2008 R2 แต่ฉันเดาว่ามันคงเหมือนกันสำหรับ SQL 2008, SQL 2005 และอาจเป็น SQL 2000

ชี้แจง:

ไม่มีโปรแกรมอื่น ๆ ที่ทำงานอยู่บนกล่องที่มีก็ทุ่มเทให้กับ SQL Server เว็บไซต์ทำงานบนกล่องแยกต่างหาก

มันเป็น SQL Server 2008 R2 Standard Edition 64 บิตบน Windows Server 2008 R2 Enterprise 64 บิต

ผมทำงานเพียงอ่านอย่างเดียวและฐานข้อมูลคำสั่งเป็นชุดที่จะอ่านอย่างเดียว

สมมติว่ามีดัชนีที่ดีอยู่แล้ว คำถามนี้เกี่ยวกับ SQL Server ที่สร้างทางเลือก # 1 กับตัวเลือก # 2 วิธีที่ทำให้มันหากมีวิธีการควบคุมและถ้า RAM Disk ช่วยให้มันเป็นทางเลือกที่เหมาะสมสำหรับการค้นหาบริสุทธิ์


อะไรทำให้คุณคิดว่า tempdb กำลังถูกใช้งานแม้ว่าคุณจะไม่ได้สร้างตารางชั่วคราว คุณใช้งานแตกต่างกันหรือจัดกลุ่มตามตาราง?
ช่องแคบดาริน

3
32/64 บิต? ทางกายภาพหรือเสมือน เซิร์ฟเวอร์นี้ใช้กับ SQL Server หรือคุณใช้ IIS หรือแอพอื่น ๆ ในกล่องเดียวกันหรือไม่ คุณได้ทำการวิเคราะห์แผนการดำเนินการแบบสอบถามแล้วหรือยัง คุณสามารถโพสต์ข้อความค้นหาตัวอย่างและ / หรือแผนการดำเนินการได้หรือไม่ และอีกหนึ่งความโชคดี ... ทำตามคำแนะนำของ Kendra เพื่อบันทึก sp_whoisactiveในขณะที่การค้นหาปัญหาของคุณกำลังทำงานและโพสต์ผลลัพธ์
Mark Storey-Smith

@darinstrait คำอธิบายที่เป็นไปได้มากที่สุดคือการเรียงลำดับหรือแฮชที่หก
Mark Storey-Smith

คำตอบ:


7

คำถามของคุณสามารถใช้ถ้อยคำใหม่ได้โดยทั่วไปว่า 'หน่วยความจำคิวรีทำงานอย่างไร' ดีอ่านในเรื่องที่เป็นความเข้าใจ SQL ทุนหน่วยความจำเซิร์ฟเวอร์ ก่อนที่จะเปิดใช้งานแบบสอบถามเพื่อดำเนินการอาจจำเป็นต้องให้สิทธิ์หน่วยความจำสำหรับการเรียงลำดับและแฮชและการดำเนินการหิวหน่วยความจำอื่น ๆ ทุนหน่วยความจำนี้เป็นประมาณการ ขึ้นอยู่กับสถานะของระบบปัจจุบัน (จำนวนการร้องขอที่รันและรออยู่, หน่วยความจำที่มีอยู่ ฯลฯ ) ระบบจะให้คิวรีที่หน่วยความจำให้ถึงจำนวนที่ต้องการ เมื่อหน่วยความจำได้รับแบบสอบถามเริ่มต้นการดำเนินการ (อาจต้องรอคิว 'เซมาฟอร์ทรัพยากร' ที่หวั่นก่อนที่จะได้รับสิทธิ์) เมื่อดำเนินการหน่วยความจำจะให้การรับประกันโดยระบบ จำนวนหน่วยความจำนี้สามารถใช้ร่วมกับหน้าข้อมูลได้ (เนื่องจากสามารถล้างข้อมูลลงดิสก์ได้เสมอ) แต่ไม่เคยใช้หน่วยความจำแบบอื่น (เช่นไม่สามารถเป็นเรื่อง 'ขโมย') ดังนั้นเมื่อแบบสอบถามเริ่มขอหน่วยความจำที่ได้รับจากการอนุญาตโปรแกรมจะปรับใช้สิ่งที่คุณเรียกว่า 'กลยุทธ์ # 1': หน้าข้อมูลอาจถูกขับออก (ล้างออกถ้าสกปรก) เพื่อให้แบบสอบถามกับหน่วยความจำที่ถูกสัญญาไว้ ตอนนี้ถ้าการประมาณการถูกต้องและการให้สิทธิ์เป็น 100% ของหน่วยความจำที่ร้องขอการสืบค้นไม่ควร 'หก' แต่ถ้าการประมาณการไม่ถูกต้อง (ทำให้ค่าประมาณของ cardinality ลดลงดังนั้นจึงขึ้นอยู่กับสถิติค้าง) หรือหากการสืบค้นไม่ได้รับการอนุญาตทั้งหมดที่มีการร้องขอการสอบถามจะรั่วไหล นี่คือเมื่อ tempdb เข้ามาในรูปภาพและประสิทธิภาพมักจะเป็นรถถัง

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

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

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

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


@ Mark: การสืบค้นส่วนใหญ่ไม่จำเป็นต้องมีหน่วยความจำ ผู้ประกอบการเพียงไม่กี่คน (เรียงลำดับที่โดดเด่นที่สุดและเข้าร่วมแฮ) ต้องใช้บัฟเฟอร์งานจึงขอทุน นี่คือ 'ศัพท์เฉพาะ' มาตรฐาน คุณอาจคิดถึงสภาพแวดล้อมการดำเนินการและแผนการดำเนินการแบบสอบถามซึ่งทุกแบบสอบถามเดียวต้องการหนึ่งและมีหน่วยความจำบางส่วน การอนุญาตให้หน่วยความจำมีขนาดใหญ่กว่า (MBs) ประการที่สองดูที่sys.dm_exec_query_memory_grants: คุณมีrequested(สูงสุด) required(ต่ำสุด) และgranted(สูงสุด)
Remus Rusanu

ขอโทษ. ฉันเลือกจากที่ไหนสักแห่งที่การจัดสรรขั้นต่ำต่อแบบสอบถามถูกจัดสรรจากเสมียนหน่วยความจำเดียวกันซึ่งไม่ถูกต้อง
Mark Storey-Smith

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

OP อ้างว่ามีดัชนีที่จำเป็นทั้งหมด หากเป็นความจริงและภาระงานที่มีทุนมากพอที่หน่วยความจำ (และแม้การรั่วไหล) เป็นปัญหาที่จะเห็นแล้วฉันจะบอกว่าภาระงานมีการวิเคราะห์มากเกินไปสำหรับเว็บไซต์ ท้ายที่สุดการเพิ่มประสิทธิภาพเป็นเกมที่ต้องสอบสวนเพื่อหาสาเหตุ ข้อความผ้าห่มและเรย์แบนทั้งหมดมักจะพบตัวอย่างเคาน์เตอร์ที่พิสูจน์พวกเขาผิดนั่นคือสิ่งที่ได้รับ OP มีปัญหาการออกแบบที่สร้างภาระงานวิเคราะห์มากเกินไปหรือไม่? ฉันไม่รู้ ฉันคิดว่ามันจะทำอย่างไร ฉันจะบอกว่ามีความมั่นใจ 87.5% ใช่
Remus Rusanu

@Remus: การคาดเดาของคุณดีเคียวรีเว็บไซต์ของฉันวิเคราะห์ได้ 100% ช่วยให้ผู้ใช้สามารถสร้างแบบสอบถามที่เป็นไปได้ใด ๆ ใน UI เพื่อส่งชุดค่าผสมที่เป็นไปได้ของตัวกรองการรวมและการจัดกลุ่มไปยัง SQL Server (ซึ่งแน่นอนทำให้การจัดทำดัชนียาก) ใช่ฉันสามารถทำให้พวกเขาทำงานในโหมดการบันทึกแบบ async เพื่อการสืบค้นในภายหลัง แต่เป้าหมายคือการทำให้การสืบค้นใด ๆ ทำงานเร็วมากผลลัพธ์นั้นจะพร้อมใช้งานทันทีหลังจาก 2-10 วินาทีและการสืบค้นเชิงวิเคราะห์เป็นฟังก์ชันเดียวของเว็บไซต์นั้น ฉันคิดว่าการทำให้เป็น async นั้นสมเหตุสมผลถ้ามีข้อความค้นหาอื่น ๆ ที่ไม่วิเคราะห์
alpav

3

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

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

SQL Server จะใช้ tempdb สำหรับการเรียงลำดับภายในหรือแฮชรวม / รวมหรือตัวดำเนินการสปูล ฯลฯ และคุณไม่สามารถควบคุมพฤติกรรมนี้ได้ สิ่งที่คุณทำได้คือ จำกัด จำนวนข้อมูลที่ส่งคืน

คุณได้ตรวจสอบสถิติการรอในกล่องนี้หรือไม่? ทุกครั้งที่ SQL Server รอทรัพยากร SQL Server จะติดตามทรัพยากรการรอและดูข้อมูลนั้นช่วย

ดูข้อความค้นหาการวินิจฉัยของ Glenn Berry และนั่นจะเป็นการเริ่มต้นที่ดีสำหรับคุณ

ดูที่การบังคับใช้พารามิเตอร์ตามที่กล่าวไว้ในhttp://weblogs.sqlteam.com/dang/archive/2009/06/27/Forced-Parameterization-A-Turbo-Button.aspx


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

สถิติของคุณทันสมัยหรือไม่? ฐานข้อมูลแบบอ่านอย่างเดียวไม่สามารถสร้างสถิติได้หากฐานข้อมูลขาดหายไปหรือล้าสมัย ข้อมูลของคุณบิดเบือนหรือมีค่าที่ไม่ซ้ำกันสำหรับคีย์ มีหลายปัจจัยที่อาจทำให้เกิดพฤติกรรมนี้
Sankar Reddy

"พฤติกรรมนี้" คุณหมายถึงอะไร ฉันไม่ได้พูดถึงว่ามีบางอย่างผิดปกติ ฉันแค่ต้องการเพิ่มประสิทธิภาพภายใต้สถานการณ์พิเศษของฉัน SQL Server ได้รับการปรับให้ทำงานในสถานการณ์ใดก็ได้ แต่อาจหรือไม่อาจทำงานได้ไม่ดีเท่าที่ควร ฉันไม่แน่ใจว่าฉันสามารถเชื่อถือ SQL Server เพื่อสร้างทางเลือกที่สมดุล # 1 กับ # 2 ทุกครั้งที่ฉันใส่ข้อมูลใหม่ฉันจะเรียกใช้ sp_updatestats
alpav

# 1 และ # 2 ไม่เกิดขึ้นอย่างที่คุณคิด msdn.microsoft.com/en-us/library/ms191475(v=sql.105).aspx msdn.microsoft.com/en-us/library/aa337560(v=sql.105).aspx
Sankar Reddy

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

2

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

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

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

ฉันจะเพิ่มประสิทธิภาพของการสืบค้น SQL บริสุทธิ์ทั้งหมดได้อย่างไร

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

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