ขณะนี้ฉันได้รับมอบหมายให้ติดตั้งสกีมาหน่วยเก็บข้อมูลสำหรับข้อมูลจำนวนมาก ข้อมูลจะถูกเข้าถึงเป็นหลักเพื่อกำหนดdata point
ค่าปัจจุบันแต่ฉันก็ต้องติดตามประวัติหกเดือนที่ผ่านมาสำหรับแนวโน้ม / วิเคราะห์ข้อมูล
มีการเพิ่มข้อกำหนดล่าสุดเพื่อติดตามmin
/ max
/ sum
ค่าสำหรับชั่วโมงที่ผ่านมา
หมายเหตุ: โดยหลักการแล้วฉันต้องการพิจารณาตัวเลือก MongoDB แต่ฉันต้องแสดงให้เห็นว่าฉันได้ใช้ตัวเลือก SQL-Server หมดแล้ว
ข้อมูล
ตารางต่อไปนี้แสดงถึงแหล่งข้อมูลหลัก (สอบถามบ่อยที่สุด) ตารางจะมีแถวประมาณห้าล้านแถว การเปลี่ยนแปลงข้อมูลส่วนใหญ่จะเป็นUPDATE
คำสั่งที่มีข้อความเป็นครั้งคราวมากINSERT
หลังจากการโหลดข้อมูลเริ่มต้น ฉันเลือกที่จะจัดกลุ่มข้อมูลตามdataPointId
ที่คุณจะเลือกall values for a given data point
เสมอ
// Simplified Table
CREATE TABLE [dbo].[DataPointValue](
[dataPointId] [int] NOT NULL,
[valueId] [int] NOT NULL,
[timestamp] [datetime] NOT NULL,
[minimum] [decimal](18, 0) NOT NULL,
[hourMinimum] [decimal](18, 0) NOT NULL,
[current] [decimal](18, 0) NOT NULL,
[currentTrend] [decimal](18, 0) NOT NULL,
[hourMaximum] [decimal](18, 0) NOT NULL,
[maximum] [decimal](18, 0) NOT NULL
CONSTRAINT [PK_MeterDataPointValue] PRIMARY KEY CLUSTERED ([dataPointId],[valueId])
)
ตารางที่สองมีขนาดใหญ่กว่าประมาณ 3.1 พันล้านแถว (แสดงถึงข้อมูลในช่วงหกเดือนที่ผ่านมา) ข้อมูลที่เก่ากว่าหกเดือนจะถูกลบทิ้ง มิฉะนั้นจะมีการINSERT
รายงานข้อมูลอย่างเข้มงวด(ประมาณ 200 แถว / วินาที 720,000 แถว / ชั่วโมง 17 ล้านแถว / สัปดาห์)
// Simplified Table
CREATE TABLE [dbo].[DataPointValueHistory](
[dataPointId] [int] NOT NULL,
[valueId] [int] NOT NULL,
[timestamp] [datetime] NOT NULL,
[value] [decimal](18, 0) NOT NULL,
[delta] [decimal](18, 0) NOT NULL
CONSTRAINT [PK_MeterDataPointHistory] PRIMARY KEY CLUSTERED ([dataPointId], [valueId], [timestamp])
)
ความคาดหวังคือตารางนี้จะมีขนาดใหญ่เป็นสองเท่าเนื่องจากจำนวนค่าจุดข้อมูลที่ถูกติดตามเพิ่มขึ้นเป็น 400 แถว / วินาที
คำถาม (ใช่ฉันถามมากกว่าหนึ่ง ... พวกเขาทั้งหมดที่เกี่ยวข้องอย่างใกล้ชิด)
ขณะนี้ฉันใช้ฐานข้อมูล SQL-Server 2008 R2 Standard Edition ฉันน่าจะทำให้เป็นกรณีสำหรับการอัพเกรดเป็น Enterprise Edition หากสามารถรับระดับประสิทธิภาพที่ต้องการด้วยพาร์ทิชันตาราง (หรือ MongoDB ถ้าไม่สามารถตีระดับประสิทธิภาพที่ต้องการด้วย SQL-Server) ฉันต้องการให้คุณป้อนข้อมูลต่อไปนี้:
1) ระบุว่าฉันจะต้องคำนวณmin
, max
และsum
สำหรับชั่วโมงที่ผ่านมา (ในnow - 60 minutes
) วิธีที่ดีที่สุดในการติดตามข้อมูลล่าสุดคืออะไร:
เก็บข้อมูลล่าสุดในหน่วยความจำของบริการข้อมูล เขียนคำนวณต่ำสุด / สูงสุด / เฉลี่ยกับแต่ละข้อมูล UPDATE
ค้นหาประวัติล่าสุดจากตารางประวัติ (ส่งผลต่อคำถามถัดไปหรือไม่) ระหว่างคำสั่ง UPDATE แต่ละคำ ข้อความค้นหาจะเข้าถึงข้อมูลล่าสุดเพื่อหาค่าจุดข้อมูลและควรสแกนเฉพาะในบันทึกล้านครั้งสุดท้ายเท่านั้น
เก็บประวัติล่าสุดในแถว DataPointValue เองเพื่อหลีกเลี่ยงการค้นหาตารางประวัติหรือไม่ อาจเก็บไว้เป็นสตริงที่มีการคั่นและประมวลผลภายใน UPDATE proc หรือไม่
ตัวเลือกอื่นที่ฉันไม่ได้พิจารณา?
2) สำหรับการDataPointValueHistory
ค้นหาที่เทียบได้กับข้อมูลมักจะเกิดขึ้นเสมอdataPointId
และอย่างน้อยหนึ่งvalueId
รายการ โดยทั่วไปแล้วการสอบถามข้อมูลจะเป็นวันสุดท้ายสัปดาห์หรือเดือน แต่อาจจะเต็มไปด้วยหกเดือนในบางกรณี
ขณะนี้ฉันกำลังสร้างชุดข้อมูลตัวอย่างเพื่อทำการทดสอบว่ามีความเหมาะสมมากกว่าในการทำคลัสเตอร์โดย dataPointId / valueId / timeStamp หรือ timeStamp / dataPointId / valueId หากใครมีประสบการณ์เกี่ยวกับการจัดการกับตารางขนาดนี้และยินดีที่จะให้ข้อมูลเชิงลึกของพวกเขาก็จะได้รับการชื่นชม ฉันเอนไปทางตัวเลือกหลังเพื่อหลีกเลี่ยงการแตกแฟรกเมนต์ดัชนี แต่ประสิทธิภาพของคิวรีเป็นสิ่งสำคัญ
ทำคลัสเตอร์
DataPointValueHistory
ตาม dataPointId -> valueId -> timeStampทำคลัสเตอร์
DataPointValueHistory
ตาม timeStamp -> dataPointId -> valueId
3) ในที่สุดตามที่กล่าวไว้ข้างต้นฉันคิดว่ามันสมเหตุสมผลแล้วที่จะแบ่งDataPointValueHistory
ตาราง คำแนะนำใด ๆ เกี่ยวกับวิธีการแบ่งพาร์ติชันข้อมูลประวัติที่ดีที่สุดจะได้รับการชื่นชมอย่างมาก
หากทำคลัสเตอร์โดยการประทับเวลาก่อนฉันคิดว่าข้อมูลควรถูกแบ่งพาร์ติชันตามสัปดาห์ (รวม 27 พาร์ติชัน) พาร์ทิชันที่เก่าแก่ที่สุดจะถูกกำจัดหลังจากสัปดาห์ที่ 27
หากทำคลัสเตอร์โดย dataPointId ก่อนฉันคิดว่าควรแบ่งพาร์ติชันโดยโมดูลัสของ id หรือไม่
เนื่องจากฉันมีประสบการณ์ จำกัด ในการแบ่งพาร์ติชันตารางความเชี่ยวชาญของคุณจะได้รับการชื่นชม