เรามีฐานข้อมูลสำหรับผลิตภัณฑ์ที่เขียนหนัก เราเพิ่งซื้อเครื่องเซิร์ฟเวอร์ใหม่พร้อม SSD เพื่อช่วย ด้วยความประหลาดใจของเราการแทรกไม่เร็วกว่าบนเครื่องเก่าของเราที่มีการจัดเก็บช้ากว่ามาก ในระหว่างการเปรียบเทียบเราสังเกตเห็นว่าอัตรา IO ที่แสดงโดยกระบวนการ SQL Server นั้นต่ำมาก
ตัวอย่างเช่นฉันรันสคริปต์ที่พบในหน้านี้ยกเว้นว่าฉันได้เพิ่ม BEGIN TRAN และ COMMIT รอบลูป ที่ดีที่สุดฉันจะเห็นการใช้งานดิสก์ถึง 7Mb / s ในขณะที่ CPU แทบจะไม่ได้สัมผัส 5% เซิร์ฟเวอร์มีการติดตั้ง 64Gb และใช้ 10 เวลาการทำงานทั้งหมดคือ 2 นาที 15 วินาทีสำหรับการโทรครั้งแรกจนถึงประมาณ 1 นาทีสำหรับการโทรครั้งต่อไป ฐานข้อมูลเป็นการกู้คืนอย่างง่ายและไม่ได้ใช้งานในระหว่างการทดสอบ ฉันวางโต๊ะระหว่างการโทรแต่ละครั้ง
ทำไมสคริปต์ง่าย ๆ นี้ถึงช้าจัง ฮาร์ดแวร์แทบจะไม่มีการใช้เลย ทั้งเครื่องมือการเปรียบเทียบดิสก์เฉพาะและ SQLIO ระบุว่า SSD ทำงานอย่างถูกต้องด้วยความเร็วสูงกว่า 500Mb / s สำหรับทั้งการอ่านและการเขียน ฉันเข้าใจว่าการเขียนแบบสุ่มช้ากว่าการเขียนตามลำดับ แต่ฉันคาดว่าการแทรกแบบง่ายเช่นนี้ไปยังตารางที่ไม่มีการทำดัชนีแบบคลัสเตอร์จะเร็วกว่ามาก
ในที่สุดสถานการณ์ของเรามีความซับซ้อนมากขึ้น แต่ฉันรู้สึกว่าฉันต้องเข้าใจกรณีง่าย ๆ ก่อน สรุปแอปพลิเคชันของเราจะลบข้อมูลเก่าจากนั้นใช้ SqlBulkCopy เพื่อคัดลอกข้อมูลใหม่ไปยังตารางชั่วคราวทำการกรองบางอย่างและในที่สุดก็ใช้ MERGE และ / หรือ INSERT INTO ขึ้นอยู่กับกรณีที่คัดลอกข้อมูลไปยังตารางสุดท้าย
-> แก้ไข 1: ฉันทำตามขั้นตอนที่เชื่อมโยงโดย Martin Smith และฉันได้รับผลลัพธ์ต่อไปนี้:
[Wait Type] [Wait Count] [Total Wait (ms)] [T. Resource Wait (ms)] [T. Signal Wait (ms)]
NETWORK_IO 5008 46735 46587 148
LOGBUFFER 901 5994 5977 17
PAGELATCH_UP 40 866 865 1
SOS_SCHEDULER_YIELD 53279 219 121 98
WRITELOG 5 145 145 0
PAGEIOLATCH_UP 4 58 58 0
LATCH_SH 5 0 0 0
ฉันพบว่ามันแปลก NETWORK_IO ใช้เวลาส่วนใหญ่พิจารณาว่าไม่มีผลลัพธ์ที่จะแสดงและไม่มีข้อมูลที่จะถ่ายโอนที่อื่นนอกเหนือไปจากไฟล์ SQL ชนิด NETWORK_IO รวมถึง IO ทั้งหมดหรือไม่
-> แก้ไข 2: ฉันสร้างดิสก์ RAM 20Gb และติดตั้งฐานข้อมูลจากที่นั่น เวลาที่ดีที่สุดที่ฉันมีบน SSD คือ 48 วินาทีโดยมี RAM ดิสก์ลดลงเหลือ 37 วินาที NETWORK_IO ยังคงเป็นการรอคอยที่ยิ่งใหญ่ที่สุด ความเร็วในการเขียนสูงสุดไปยังดิสก์ RAM คือประมาณ 250Mb / s ในขณะที่สามารถทำหลายกิกะไบต์ต่อวินาที มันยังไม่ได้ใช้ CPU มากดังนั้นการถือ SQL คืออะไร
NETWORK_IO
อาจจะมาจาก 3 ล้าน "1 แถว (s) ได้รับผลกระทบ" ข้อความที่ถูกส่งกลับ คุณลองเพิ่มSET NOCOUNT ON
ไปยังสคริปต์หรือไม่
EE_WaitStats*.xel
ดังนั้นการ์ดเก่าจะปนเปื้อนผลลัพธ์ของคุณ
SET NOCOUNT ON
เข้าไปด้วย