หากฐานข้อมูลมีการแทรกเพียงครั้งเดียวมันจะไม่ดีที่จะทำดัชนีชุดค่าผสมของคอลัมน์ที่เป็นไปได้หรือไม่?


23

ฉันกำลังทำงานกับระบบการรายงานที่จะต้องใช้แบบสอบถามที่มีขนาดใหญ่ แต่ขึ้นอยู่กับฐานข้อมูลที่กรอกเพียงครั้งเดียว ระบบการจัดการฐานข้อมูลคือ Microsoft SQL Server 2017 อาจมีวิธีที่ดีกว่าในการออกแบบระบบเช่นนี้

ในทางทฤษฎีการพูด:

  1. หากเรามีฐานข้อมูลขนาดใหญ่มาก (150M + แถวในหลายตาราง)
  2. และเราสามารถสรุปได้ว่าฐานข้อมูลจะถูกบรรจุครั้งเดียว

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


4
ชุดค่าผสมที่เป็นไปได้ทุกชุดเป็นไปไม่ได้เกือบทุกครั้ง แนวทางที่เหมาะสมกว่าคือการจัดทำดัชนีด้วยตนเอง แต่ไม่เห็นแก่ตัวมาก แน่นอนว่ามันสมเหตุสมผล
usr

12
ฉันขอแนะนำให้เขียนชื่อเรื่องหรือข้อความที่เป็นตัวหนาของคุณเพื่อให้สอดคล้องกัน คร่าว ๆ ฉันรู้สึกสับสนกับคำตอบที่ได้รับการโหวตสูงสุดว่า "ใช่"
aaaaaa

150M แถวมีขนาดใหญ่สำหรับตารางเดียว แต่ไม่ใหญ่สำหรับฐานข้อมูล ในทางปฏิบัติระบบรายงานจะใช้ชุดค่าผสมของคอลัมน์ที่เป็นไปได้เพียงเล็กน้อยเท่านั้นซึ่งเป็นการดีที่สุดที่จะมุ่งเน้นไปที่การผสมคีย์อย่างน้อยในตอนแรกจากนั้นจะมีความซับซ้อนมากขึ้นตามต้องการ
pojo-guy

คำตอบ:


36

ใช่มันจะมีผลต่อเวลาในการรวบรวมแผนเริ่มต้นเนื่องจากเครื่องมือเพิ่มประสิทธิภาพจะมีเส้นทางการเข้าถึงพิเศษมากมายให้กับข้อมูลที่ต้องพิจารณา

เนื่องจากคุณอยู่บน SQL Server 2017 โหลดครั้งเดียวและเรียกใช้รายงานทำไมไม่ใช้ดัชนีที่เก็บคอลัมน์แบบคลัสเตอร์แทน

นั่นน่าจะเป็นทางออกที่ดีที่สุดสำหรับความต้องการของคุณในการจัดทำดัชนีทุกคอลัมน์ที่เป็นไปได้

ดัชนี Columnstore - ภาพรวม


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

26

หากคุณมีคอลัมน์ N อยู่ในตารางการรวมกันของคอลัมน์ที่เป็นไปได้คือ 2 ^ N-1 (ลบชุดว่าง) สำหรับ 10 คอลัมน์ที่จะหมายถึง 1,023 ดัชนีสำหรับ 20 คอลัมน์เราท้ายด้วยดัชนีมหันต์ 1048575 ดัชนีส่วนใหญ่จะไม่ใช้ แต่จะต้องนำมาพิจารณาโดยเครื่องมือเพิ่มประสิทธิภาพ เป็นไปได้ว่าเครื่องมือเพิ่มประสิทธิภาพจะเลือกดัชนีย่อยที่ดีที่สุดแทนดัชนีที่ดีกว่า ฉันจะไม่ใช้เส้นทางของการสร้างดัชนีทุกประเภทแทนที่จะพยายามหาว่าดัชนีใดที่จะเป็นประโยชน์

แก้ไขจำนวนแก้ไขของดัชนีที่เป็นไปได้

ขณะที่เจฟฟ์ชี้ให้เห็นก็จะยิ่งเลวร้ายยิ่งกว่า 2 ^ N (พลังงานชุด) ตั้งแต่ (3,2,1) เห็นได้ชัดว่าแตกต่างกว่า (1,2,3) สำหรับคอลัมน์ N เราสามารถเลือกตำแหน่งแรกในดัชนีที่มีคอลัมน์ทั้งหมดในรูปแบบ N สำหรับตำแหน่งที่สองในวิธี N-1 ฯลฯ ดังนั้นเราจบลงด้วย N! ดัชนีที่แตกต่างกันของขนาดเต็ม ไม่มีการจัดทำดัชนีเหล่านี้จากดัชนีอื่นในชุดนี้ นอกจากนี้เราไม่สามารถเพิ่มดัชนีที่สั้นกว่านี้เพื่อไม่ให้ครอบคลุมดัชนีแบบเต็ม จำนวนดัชนีจึงเป็น N! ตัวอย่างสำหรับ 10 คอลัมน์จึงกลายเป็น 10! = 3628800 ดัชนีและสำหรับ 20 (ดรัมโรลเลอร์) 2432902008176640000 ดัชนี นี่เป็นจำนวนที่น่าขันถ้าเราใส่จุดสำหรับแต่ละดัชนีหนึ่งมม. ส่วนหนึ่งมันจะใช้เวลาแสงไฟ 94 วันในการส่งผ่านจุดทั้งหมด ทั้งหมดและทั้งหมดไม่ ;-)


6
ยิ่งแย่ไปกว่า: ลำดับของคอลัมน์ในดัชนีอาจมีความสำคัญ ดังนั้นคุณจะได้รับสูงสุด N! ดัชนี
Jeff

2
แต่คุณไม่ต้องการดัชนีที่เป็นส่วนนำหน้าของดัชนีอื่น ๆ
Barmar

3
มันยิ่งแย่กว่านี้อีก มีการรวมกันของ ASC และ DESC สำหรับทุกดัชนี
ypercubeᵀᴹ

2
และที่แย่กว่านั้นคือมีดัชนีรวมอยู่ด้วย
ypercubeᵀᴹ

2
และดัชนีบางส่วนจำนวนมาก
ypercubeᵀᴹ

7

เลขที่

การใช้ดัชนี "ทุกอย่าง" ไม่เป็นประโยชน์ แต่คุณสามารถจัดทำดัชนี "ส่วนใหญ่" ได้

นี่คือสิ่งที่ ถ้าตารางมีคอลัมน์แล้วจำนวนของดัชนีที่เป็นไปได้คือN N!สมมติว่าตารางมี 10 คอลัมน์แล้วคุณไม่ได้มีเพียง10ดัชนีไปได้ 10!แต่ นั่นคือ ... 3,628,800 ... บนโต๊ะเดี่ยว นั่นคือพื้นที่ดิสก์จำนวนมากดิสก์ I / O แคชและการค้นหาครั้ง

ทำไม? เหตุผลไม่กี่:

  • ดัชนี Lightwwight มักจะถูกแคชบางสิ่งที่ทำให้พวกเขาสว่างขึ้นอย่างรวดเร็ว หากคุณมี 3 ล้านคนพวกเขาจะไม่ถูกแคช

  • เครื่องมือเพิ่มประสิทธิภาพ SQL อาจใช้เวลาในการตัดสินใจว่าจะใช้อันไหนดีกว่าโดยเฉพาะเมื่อใช้การรวม

  • เครื่องมือเพิ่มประสิทธิภาพ SQL อาจยอมแพ้ในการใช้อัลกอริธึมที่ครอบคลุม นี่อาจเป็น "น้อยกว่าดีที่สุด" ตัวอย่างเช่น PostgreSQL มีตัวเลือกต่าง ๆ สำหรับ "คิวรีตารางน้อยกว่า 8" และ "คิวรีตารางมากกว่า 8"

  • ดัชนีควรเบากว่ากอง หากคุณกำลังทำดัชนีทุกอย่างดัชนีก็จะหนักพอ ๆ กับฮีป ... สิ่งที่เอาชนะวัตถุประสงค์ของดัชนี


ไม่ใช่เลข 2 ^ 10 ใช่ไหม แต่ละคอลัมน์จะถูกรวมหรือแยกออกจากดัชนีที่ระบุ การสั่งซื้อมีความสำคัญหรือไม่
RemcoGerlich

2
@RemcoGerlich ใช่คำสั่งนั้นสำคัญ
ypercubeᵀᴹ

2

ไม่อาจไม่ส่งผลกระทบเชิงลบต่อSELECTข้อความค้นหา แต่

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

มันสามารถทำให้เกิดปัญหาในการรวบรวมเวลา
Erik Darling

@sp_BlitzErik คุณคิดกับ ORM ในแอพไหม
peterh กล่าวว่าคืนสถานะโมนิก้า

ไม่เห็นคำตอบของฉัน
Erik Darling

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