จะเก็บบันทึกเว็บเซิร์ฟเวอร์ 'วัน' ใน SQL Server ได้อย่างไร


18

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

เรามีดีมอนที่รับฟังกิจกรรมการร้องขอ / ตอบสนองจาก load balancer และแทรกจำนวนมากของเราในฐานข้อมูล

อย่างไรก็ตามเราได้รับบันทึกประมาณ 1 GB ต่อวันและเราต้องเก็บประมาณหนึ่งสัปดาห์ (อย่างน้อยในรูปแบบดิบนี้)

วิธีที่ดีที่สุดในการจัดเก็บข้อมูลนี้และวิธีที่ดีที่สุดในการลบรายการเก่าคืออะไร?

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


นี่เป็นคำถามที่คล้ายกันมาก แต่สำหรับ Oracle; ไวยากรณ์จะแตกต่างกัน obv แต่นี่เป็นแอปพลิเคชันแบบคลาสสิกของการแบ่งพาร์ติชันตามวันที่ ไม่จำเป็นต้องบูรณาการล้อ :-)
Gaius

คำตอบ:


17

คุณควรตรวจสอบการแบ่งพาร์ทิชัน

http://technet.microsoft.com/en-us/library/dd578580%28SQL.100%29.aspx

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

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

จากนั้นสร้างงานตัวแทนเซิร์ฟเวอร์ SQL ที่ใช้ T-SQL เพื่อสลับพาร์ติชั่นสุดท้ายทุกวัน การลบจะกลายเป็นการดำเนินการเมตาดาต้าและมันก็รวดเร็ว สลับพาร์ติชั่นแล้วปล่อยอันเก่าออก


ฉันจะตรวจสอบดูว่า - อนุญาตให้วางพาร์ติชั่นแต่ละตัวหรือไม่ดังนั้นการลบสามารถทำได้อย่างรวดเร็วหรือไม่?
Jarrod Dixon

3
ใช่คุณควรพิจารณาแนวคิด "พาร์ทิชันหน้าต่างบานเลื่อนอัตโนมัติ" โดยเฉพาะ ชุดที่ดีของบทความที่คุณสามารถค้นหาบน SQLServerCentral: part1 , part2และPart3
แมเรียน

7

เราได้พัฒนาผลิตภัณฑ์บันทึกข้อมูล webstatistic เมื่อ 6 ปีที่แล้วซึ่งทำให้เราสามารถติดตามการคลิกของผู้ใช้ทุกครั้งที่เข้าชม

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

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

วิธีนี้เราสามารถจัดการ "การบำรุงรักษาตามกำหนด" โดยไม่ต้องสูญเสียข้อมูล

เกี่ยวกับปัญหาการล้างข้อมูลบนเซิร์ฟเวอร์ศูนย์แผนปัจจุบันของเราคือการเพิ่ม "timestamps" เพื่อให้สามารถเก็บถาวรข้อมูลหลังจากนั้น 3 เดือน.

เราคิดเช่นนี้เหมือนกับพื้นผิว MIP-MAP ในเกม 3D / การเรนเดอร์ ยิ่งคุณได้รับข้อมูลที่ละเอียดมากเท่าใดยิ่งไกลยิ่งไกลยิ่ง "จัดกลุ่ม" มากเท่านั้นก็ยิ่งละเอียดมากขึ้นเท่านั้น

ดังนั้นในแต่ละวันเราสามารถสังเกตรูปแบบของผู้เข้าชมได้ แต่หลังจาก 3 เดือนข้อมูลเหล่านั้นไม่เกี่ยวข้องกันมากและเราบีบอัดข้อมูลให้มีรายละเอียดน้อยลง

เราไม่ได้ตัดสินใจว่าจะแบ่งฐานข้อมูลออกเป็นส่วน ๆ หรือไม่เพื่อรักษาระดับรายละเอียด ฐานข้อมูล แต่เราก็อาจจะเนื่องจากมีปัญหาการตั้งชื่อถ้าเราเก็บระดับที่แตกต่างในฐานข้อมูลเดียวกัน

หวังว่าคุณจะสามารถใช้สิ่งนี้เพื่ออะไรบางอย่าง? ฉันไม่สามารถให้โค้ดตัวอย่างให้คุณซึ่งเป็นส่วนหนึ่งของผลิตภัณฑ์ บริษัท ของเรา


1

สร้างอีกหนึ่งตาราง Daily_tables ด้วยสองคอลัมน์: Table_name และ Date_table_created ในรหัสของคุณที่สร้างตารางรายวันใหม่ (ที่โหลดบันทึกการใช้เว็บ) เพิ่มรายการอื่นเพื่อเติมข้อมูลตาราง Daily_tables ด้วยชื่อของตารางที่สร้างขึ้นและการประทับเวลา (เวลาวันที่ปัจจุบัน) สร้างงานเอเจนต์ SQL ที่จะรันสคริปต์ TSQL ทุกสัปดาห์ TSQL ควรปล่อยชื่อตารางทั้งหมด (Table_name) จาก Daily_tables ด้วย Date_table_created timestamp ที่เก่ากว่า 7 วัน

หวังว่านี่คือสิ่งที่คุณกำลังมองหา :)

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