การแบ่งพาร์ติชันเซิร์ฟเวอร์ SQL - สิ่งที่ต้องใช้สำหรับพาร์ติชันคีย์?


10

ฉันไม่เคยทำงานกับการแบ่งพาร์ติชันของเซิร์ฟเวอร์ SQL แต่ขณะนี้ฉันต้องเผชิญกับการออกแบบฐานข้อมูลซึ่งอาจรับประกันไดรฟ์ ระบบนี้ใช้สำหรับคูปอง คูปองจะออกเป็นระยะโดยปกติทุก ๆ หกสัปดาห์แม้ว่าจะมีการออกโฆษณาแบบเฉพาะกิจเช่นสำหรับกิจกรรมพิเศษ มีลูกค้า 15 ล้านคนและสำหรับการออกแต่ละครั้งลูกค้าทุกคนจะได้รับคูปอง 6 ประเภทที่แตกต่างกันโดยมีคูปองรวม 90 ล้านใบ เราจำเป็นต้องติดตามข้อมูลการแลกรับอินสแตนซ์คูปองและเก็บรักษาไว้เป็นเวลา 6 เดือนถึงแม้ว่าโดยทั่วไปแล้วคูปองจะใช้ได้เพียงหกสัปดาห์เท่านั้น คำขอแลกรางวัลใด ๆ สำหรับคูปองที่ไม่ถูกต้องจะไม่สามารถเข้าถึงฐานข้อมูลได้เพราะจะทำการตรวจสอบโดย POS จนถึง

ในช่วงเวลาหกเดือนเราจะต้องเก็บแถวได้ 360 ล้านแถวในตารางอินสแตนซ์คูปองและมากถึง 72 ล้านแถว (สมมติว่ามีอัตราการไถ่ถอนสูงสุด 20%) ในตารางแลกซื้อ ฉันรู้สึกว่าตัวเลขเหล่านี้ใหญ่เกินไปสำหรับพาร์ติชันเดียวหรือไม่

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

If issuance event = 1 and last digit of customer id < 5 then
    Store in partition 1
Else if issuance event = 1 and last digit of customer id >4 then
    Store in partition 2
Else if issuance event =2 and last digit of customer id <5 then
    Store in partition 3
Else if issuance event =2 and last digit of customer id >4 then
    Store in partition 4
Etc...

นอกจากนี้ฉันไม่แน่ใจเกี่ยวกับข้อมูลจำเพาะของเซิร์ฟเวอร์ฐานข้อมูลที่เราต้องการ 16gb และ 8CPU จะเพียงพอหรือไม่ db ต้องสามารถส่งคืนผลลัพธ์จากตารางอินสแตนซ์คูปองโดยป้อนค่าบาร์โค้ดเป็นตัวเลขในเวลาน้อยกว่าครึ่งวินาที คำขอธุรกรรมที่คาดไว้สำหรับการตรวจสอบความถูกต้อง (เลือก) และแลก (แทรก) คาดว่าจะสูงสุดที่ประมาณ 3,500 ต่อนาที

เซิร์ฟเวอร์ SQL Server 2008r2 64 บิต db จะถูกจัดเตรียมเป็น VM จากโฮสต์ที่มีประสิทธิภาพมากพร้อมการเข้าถึงประสิทธิภาพสูงและ SAN ความจุขนาดใหญ่

ฉันจะขอบคุณมากสำหรับคำแนะนำใด ๆ จากผู้ที่ได้ปรับใช้โซลูชัน SQL Server เพื่อจัดการปริมาณที่คล้ายกัน

ความนับถือ

ปล้น.


2
ตารางของคุณยังเล็ก - ไม่ต้องใช้พาร์ติชั่นฉันมีโต๊ะที่มีสองพันล้านแถวโดยไม่มีพาร์ติชั่นทำงาน พาร์ติชันนั้นดีสำหรับ FAST DROP
TomTom

1
Nonsense @TomTom พาร์ทิชันสามารถเป็นประโยชน์ที่แถวนับเศษของนี้ การรับชุดรูปแบบพาร์ติชันจะต้องเป็นประโยชน์กับรูปแบบการเข้าถึงเพื่อให้ได้ประสิทธิภาพเพิ่มขึ้น แต่ผ้าห่ม "ไม่มีความต้องการ" ในขนาดนี้เป็นข้อผิดพลาดธรรมดา
Mark Storey-Smith

1
ไม่ถูกต้อง NEED! = ประโยชน์ ความต้องการคือเมื่อคุณพบปัญหาในการทำแบบสอบถามโดยไม่มีพาร์ติชัน
TomTom

1
เฮ้ @TomTom ฉันคิดว่าคุณต้องมีเพื่อนพักเล็ก ๆ นั่นเป็นความแข็งแกร่งเล็กน้อยแม้ว่าจะไม่เป็นที่น่ารังเกียจก็ตาม ฉันเห็นด้วยกับ Mark StoreySmith ผ้าห่ม "ไม่มีความจำเป็น" เป็นสิ่งที่ผิดธรรมดา แต่การยืนยันของคุณว่าอาจไม่จำเป็นต้องถูกต้อง ฉันคิดว่ามันเป็นเรื่องของการจัดทำดัชนี ฉันก็รู้ว่ามาร์ครู้ว่าคุณหมายถึงอะไรโดยต้องการเทียบกับผลประโยชน์ ตัดพวกเราให้หย่อนหน่อยแล้วปล่อยให้คาเฟอีน k? (และเชื่อใจฉันฉันรู้ว่าจะมีความอดทนน้อยมากในบางวันโดยเฉพาะวันเช่นวันนี้ที่ฉันใช้ยาแก้ปวดหลัง)
jcolebrand

คำตอบ:


14

คำถามข้อกำหนดเซิร์ฟเวอร์ควรส่งไปที่ Serverfault หรือ DBA.SE

สำหรับคำถามการแบ่งพาร์ติชันฉันไม่คิดว่าคุณจำเป็นต้องแบ่งพาร์ติชันสำหรับสิ่งนี้

แถว 360 ม. มีจำนวนมาก แต่ก็ไม่ได้เทอะทะเกินไป

อย่าไม่ภายใต้สถานการณ์ใด ๆ พยายามที่จะอยู่บนพื้นฐานของพาร์ทิชันหลักสุดท้ายของสนาม ฉันไม่แน่ใจว่าสิ่งนี้จะใช้งานได้ แต่มันไม่ใช่ SARGable ที่จะไม่สามารถใช้การได้

หากคุณต้องการค้นหาแถวเดียวโดยใช้คีย์ตัวเลขการแบ่งพาร์ติชันอาจไม่ช่วยได้

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



ฉันยังเห็นด้วย บางครั้งคุณต้องการดัชนีที่ดีกว่า
jcolebrand

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

สำหรับบันทึกที่จุดอื่น ๆ ของคุณผมเห็นด้วยสุดใจ :)
มาร์คชั้นสมิ ธ

@ MarkStorey-Smith - มันจะขึ้นอยู่กับคีย์ของเขา ตามที่นิยามไว้ใน OP พาร์ติชั่นจะไม่เพิ่มค่าใด ๆ ดูเหมือนว่าเขาจะไม่สามารถใช้คีย์สองส่วนกับเขตข้อมูลวันที่หรือรูปแบบพาร์ติชัน "ปกติ"
JNK

5

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

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

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


4

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

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

การแบ่งพาร์ติชันยังสามารถใช้เพื่อจัดการการแยกส่วนดัชนี คุณสามารถสร้าง / จัดระเบียบพาร์ติชันใหม่ได้

คุณควรพิจารณามุมมองที่แบ่งพาร์ติชันซึ่งต่างกับตารางที่แบ่งพาร์ติชัน พาร์ติชัน Views ไม่ต้องใช้สิทธิ์การใช้งาน SQL Server Enterprise มุมมองที่แบ่งพาร์ติชันยังช่วยให้คุณสามารถสร้างดัชนีออนไลน์ใหม่บน "พาร์ติชัน"

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

ตรวจสอบนี้วิดีโอที่ยอดเยี่ยมจากคิมเบอร์ลี Tripp ในการแบ่ง


เราต้องการเก็บข้อมูลเป็นเวลาหกเดือนเท่านั้น ในแต่ละสัปดาห์เราจะดำเนินงานดูแลทำความสะอาดซึ่งจะลบคูปองใด ๆ ที่ออกมานานกว่าหกเดือนก่อนหน้านี้
Rob Bowman

3
ดังนั้นโดยทั่วไปคุณจะต้องลบ / ลบประมาณ 15 ล้านแถวทุกสัปดาห์ โต๊ะกว้างเท่าไหร่ ฉันขอแนะนำให้คุณแบ่งคอลัมน์ตามตารางวันที่ วิธีนี้การลบรายสัปดาห์จะเป็นการดำเนินการเมตาแบบง่าย คุณเพียงแค่ต้องสลับพาร์ติชันที่เก่าที่สุดออกจากตารางพาร์ติชันหลักลงในตารางการแสดงละคร จากนั้นวางตารางการจัดเตรียม สิ่งนี้เรียกว่าสถานการณ์ Windows บานเลื่อน ค้นหากระดาษขาวเล่มแรกที่ฉันโพสต์โอ้วิธีการทำเช่นนี้
Dharmendar Kumar 'DK'

-2

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


2
มีเหตุผลมากมายที่จะใช้การแบ่งพาร์ติชันนอกเหนือจากการเก็บถาวร การแยกชิ้นส่วนนั้นมีประโยชน์อย่างมากต่อการสืบค้นหลายประเภทหากใช้อย่างถูกต้อง
Stuart Ainsworth

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