เรากำลังวิ่งออกฐานข้อมูลลับของเว็บโปรแกรมสำหรับข้อมูลการวิเคราะห์,ปัจจุบันจากพื้นฐาน C#.NET กับ EntityFramework บนเซิร์ฟเวอร์และส่วนใหญ่เป็นแบบ HTML+จาวาสคริปต์ frameworks บลูกค้าด้านข้าง(เว็บพื้นฐาน).
ของโปรแกรมเป็นประจำอย่างเราได้รับคำขู่แบบนี้ measurement X/Y datapoints batched ในขนาดใหญ่ amounts,i.e. 1e6 หรือมากกว่านี้อัปโหลดไปโดยผู้ใช้หรือถูกเซ็นกำกับโดยกันแป.
ตอนนี้เรามีโต๊ะอยู่ใน MSSQL เรียกว่า Values
กับ id, series_id as int; x, y, z as float
. โต๊ะนี่ BULK INSERT
เต็มไปด้วยข้อมูลเมื่อลูกค้าของ uploads มันและคนที่เกี่ยวข้องข้อมูลกำกับภาพคือช่วยใน Series
โต๊ะด้วย คนทั้งหมด db ขนาดปัจจุบันที่กำลังเข้ามาใกล้ 1TB,99.99%ของซึ่งมัน Values
ข้อมูล
มันเป็นวิธีง่ายๆที่จะดำเนิแต่มันมีหลาย drawbacks ซึ่งทำให้มันซับซ้อนและเชื่องช้ามากเวลา:
- เราต้องแทรกในท่อนต้องไม่เกิดจากกา IIS โพรเซสซึ่ง preprocesses มัน(ค่าที่ใช้ในปัจจุบัน 200'000 datapoints ต่อชิ้นส่วน)
- IIS โพรเซสความทรงจำความต้องการระหว่างแทรกเป็นใหญ่มาก(>1500MB สำหรับ 200MB ของข้อมูล)
- ฤติกรรมโรคจิต--การแทรกเกินไปช้า(5 ล้านบันทึกของ 100MB นี้ต้องใช้>30 วินาทีเพื่อแทรกแม้แต่จะใช้ก้อนข้อมูลแทรก)
- ระหว่างแทนที่ทั้งโต๊ะก็คือล็อค i.e. นเดียวของผู้ใช้สามารถแทรกช่วงเวลา
- กำลังรับข้อมูลมันก็ยังค่อนข้างช้าต้องการ 1e6 บันทึกบางครั้งต้องใช้>10 วินาที
- ทำการลบชุดกับ>1e6 บันทึกเป็นประจำทำให้ timeouts บนเว็บโปรแกรด้านหนึ่ง
ข้อมูลไม่เคยบางส่วนที่เลือกไว้ดังนั้นเราไม่จำเป็นต้องมีมันอยู่ในโต๊ะ แต่มันคือ'thinned ออกไป'เพื่อแสดงก่อนที่ส่งให้ลูกค้า i.e. 1e6 บันทึกของ-โดยปริยายแล้ i.e. ใน 99%ของใช้คดี-ถูกลดขนาดลงเหลือ 2000 หรือ 10 ขวบ'000 บันทึกก่อนที่จะส่งไปที่ลูกค้า นี่คือแคชข้อมูลที่ลูกค้าแต่ถ้าเป็นลูกค้าใหม่ขอร้องให้เหมือนกัตั้งค่ามันถูกประมวลผลอีกครั้ง ค่าโต๊ะก็ยังต้องมีดัชนีบน series_id
ซึ่งต้องใช้มากกตรวจสอบพื้นที่ดิสก์มากกว่าโต๊ะตัวมันเอง
ฉันสงสัยว่ามันฟังดูมีเหตุผลเพื่อเปลี่ยนองเก็บของที่รูปแบบไปแก้จุดเหลือห้องเก็บของใน"ค่า"กับตัวมันเองข้อมูลรูปแบบ(แฟ้ม csv หรือ LANGUAGE หรืฐานสอง)และบางที-คอลัมน์เพิ่มเติมกับ preprocessed'ลด'datasets สำหรับแสดงผลซึ่งได้ถูกผลักไปกองลูกค้าโดยไม่เปลี่ยน(eg. ใน LANGUAGE). ดังนั้นคนใหม่ Values
โต๊ะรูปแบบจะเป็นอะไรสักอย่างเหมือน
id, series_id, data(blob), reduced_data(blob)
และนั่นเป็นเพียงแค่หนึ่ง Value
ต่อ Series
รายการไม่ใช่ 1e6 หรือมากกว่านั้น ปลดวันที่จะสร้างขึ้นมาครั้งนึงตอนที่อัพโหลดข้อมูลคืนได้รับแล้วสำหรับใช้ในการแสดงตอนที่ลูกค้าของมัน
ฉันจะสูญเสียบางส่วนของเลือก values
โดยหมายเลขหรือเอ็กซ์/Y นค่าแต่งค่าเป็นไม่เคยเลือกจากพื้นฐานอะไรก็ตามที่นอกเหนือจากว่า id
หรือ series_id
งั้นนี่คือ ปัจจุบันที่ ไม่ใช่ limitation. ดังนั้นนี่เป็นของฉันคำถาม:
- มีเหตุผลที่ทั้งหมดเหรอ? ฉันหวังว่าการสร้างและเครื่องมือลบของผู้ใหญ่แก้จุดเหลือวันที่จะเป็นเสมสำคัญได้เร็วกว่าการสร้างและเครื่องมือลบของ 1,000,000 ดเดียวรายการบันทึก เรื่องจริงเหรอ?
- ฐานสองแก้จุดเหลือหรือแฟ้ม csv/LANGUAGE/..แก้จุดเหลือ? คนงานง่ายสุดวิธีแก้จุดเหลือเก็บข้อแน่นอนเพื่อสร้างที่ใหญ่มากแฟ้ม csv หรือ LANGUAGE ชิ้นส่วนช่วยมัน(อาจจะ gzipped)ในฐานข้อมูล เป็นกำหนดเองข้อมูลฐานสองรูปแบบจะต้องเล็กลงแต่มันจะต้องถูกแปลงไป LANGUAGE ก่อนที่จะส่งไปรายชื่อรั่วไหลออก
ฉันมีความรู้สึกเพิ่มเติม hassle องมากับข้อมูลฐานสองรูปแบบอาจจะไม่คุ้มค่ามันและมันจะดีกว่าต้อง gzip งแฟ้ม csv/LANGUAGE แก้จุดเหลือเกินกว่าจะสร้างเรื่องขึ้นมาเองได้เป็นแฟ้มแบบไบนารี เรื่องจริงเหรอ?
ยังไงเรื่องอื่น drawbacks ของลูกบอลที่ฉันอาจจะไม่รู้อีกเหรอ? ขนาดของ limitations ไม่เหมือนจะเป็นปัญหา varbinary(MAX)
เป็นเพียงพอ ฉันไม่ต้องมีดัชนีบนค่า ใน แก้จุดเหลือแค่บข้อมูลกำกับภาพ(ซึ่งอยู่ในชุดโต๊ะ).
ความคิด?