ปฏิเสธการปรับปรุงประสิทธิภาพหรือไม่ ฟังดูน่าเชื่อถือ แต่ก็ไม่ถือน้ำ
Chris Date ผู้ร่วมงานกับ Dr Ted Codd เป็นผู้เสนอต้นแบบของโมเดลข้อมูลเชิงสัมพันธ์หมดความอดทนด้วยข้อโต้แย้งที่ผิดกับการปรับสภาพและทำลายระบบอย่างเป็นระบบโดยใช้วิธีการทางวิทยาศาสตร์: เขามีฐานข้อมูลขนาดใหญ่และทดสอบการยืนยันเหล่านี้
ผมคิดว่าเขาเขียนมันขึ้นมาในฐานข้อมูลเชิงสัมพันธ์เขียน 1988-1991แต่หนังสือเล่มนี้ต่อมาถูกรีดเป็นรุ่นที่หกของการรู้เบื้องต้นเกี่ยวกับระบบฐานข้อมูลซึ่งเป็นข้อความที่ชัดเจนเกี่ยวกับทฤษฎีฐานข้อมูลและการออกแบบในรุ่นที่แปดที่ผมเขียนและมีแนวโน้มที่จะยังคงอยู่ ในการพิมพ์มานานหลายทศวรรษ Chris Date เป็นผู้เชี่ยวชาญในด้านนี้เมื่อพวกเราส่วนใหญ่ยังคงวิ่งรอบเท้าเปล่า
เขาพบว่า:
- บางคนถือเป็นกรณีพิเศษ
- พวกเขาทั้งหมดไม่ชำระเพื่อการใช้งานทั่วไป
- ทั้งหมดนั้นแย่ลงอย่างมากสำหรับกรณีพิเศษอื่น ๆ
ทุกอย่างกลับมาลดขนาดของชุดการทำงาน การเข้าร่วมที่เกี่ยวข้องกับปุ่มที่ถูกเลือกอย่างเหมาะสมพร้อมกับการตั้งค่าดัชนีอย่างถูกต้องนั้นไม่แพงเลยเพราะพวกมันยอมให้มีการตัดแต่งที่สำคัญของผลลัพธ์ก่อนที่แถวจะเกิดขึ้น
การทำให้ผลลัพธ์เป็นจริงนั้นเกี่ยวข้องกับการอ่านดิสก์จำนวนมากซึ่งเป็นแง่มุมที่แพงที่สุดของการฝึกตามลำดับความสำคัญ ในทางกลับกันการเข้าร่วมจำเป็นต้องมีการดึงกุญแจเท่านั้น ในทางปฏิบัติไม่แม้แต่จะเรียกค่าคีย์: ค่าแฮชคีย์จะใช้สำหรับการเปรียบเทียบการเข้าร่วมลดค่าใช้จ่ายของการรวมหลายคอลัมน์และลดต้นทุนการรวมที่เกี่ยวข้องกับการเปรียบเทียบสตริงอย่างรุนแรง ไม่เพียง แต่จะเหมาะกับแคชมากขึ้นเท่านั้นยังมีการอ่านดิสก์ให้น้อยลง
นอกจากนี้เครื่องมือเพิ่มประสิทธิภาพที่ดีจะเลือกเงื่อนไขที่เข้มงวดที่สุดและนำไปใช้ก่อนที่จะเข้าร่วมได้อย่างมีประสิทธิภาพใช้ประโยชน์จากการเลือกที่สูงของการรวมในดัชนีที่มีความสำคัญสูง
การเพิ่มประสิทธิภาพประเภทนี้เป็นที่ยอมรับกันสามารถนำไปใช้กับฐานข้อมูล denormalised แต่ประเภทของคนที่ต้องการ denormalise schema มักจะไม่คิดเกี่ยวกับ cardinality เมื่อ (ถ้า) พวกเขาตั้งค่าดัชนี
สิ่งสำคัญคือต้องเข้าใจว่าการสแกนตาราง (การตรวจสอบทุกแถวในตารางในการผลิตการเข้าร่วม) นั้นเป็นเรื่องยากในทางปฏิบัติ เครื่องมือเพิ่มประสิทธิภาพคิวรีจะเลือกสแกนตารางเฉพาะเมื่อมีสิ่งต่อไปนี้ตั้งแต่หนึ่งข้อขึ้นไป
- มีความสัมพันธ์น้อยกว่า 200 แถว (ในกรณีนี้การสแกนจะถูกกว่า)
- ไม่มีดัชนีที่เหมาะสมในคอลัมน์เข้าร่วม (หากการเข้าร่วมในคอลัมน์เหล่านี้มีความหมายแล้วทำไมจึงไม่จัดทำดัชนีให้แก้ไขด้วย)
- จำเป็นต้องมีการบังคับประเภทก่อนที่จะสามารถเปรียบเทียบคอลัมน์ (WTF ได้หรือไม่แก้ไขหรือกลับบ้าน) ดูหมายเหตุท้ายสำหรับปัญหา ADO.NET
- หนึ่งในข้อโต้แย้งของการเปรียบเทียบคือการแสดงออก (ไม่มีดัชนี)
การทำการดำเนินการนั้นมีราคาแพงกว่าการไม่ทำการดำเนินการ อย่างไรก็ตามการดำเนินการที่ไม่ถูกต้องถูกบังคับให้ใส่ดิสก์ I / O ที่ไม่มีจุดหมายแล้วทิ้งขยะก่อนที่จะดำเนินการเข้าร่วมที่คุณต้องการจริงๆนั้นมีราคาแพงกว่ามาก แม้ว่าการดำเนินการ "ผิด" จะถูกคำนวณไว้ล่วงหน้าและมีการใช้ดัชนีอย่างสมเหตุสมผล แต่ก็ยังคงมีบทลงโทษที่สำคัญ การทำให้เป็นปกติก่อนรวมการเข้าร่วมแม้ว่าจะมีความผิดปกติของการอัพเดทก็ตาม หากคุณต้องการที่แตกต่างกันเข้าร่วมความมุ่งมั่นที่จะเสียค่าใช้จ่ายขนาดใหญ่
หากใครต้องการเตือนฉันว่ามันเป็นโลกที่กำลังเปลี่ยนแปลงฉันคิดว่าคุณจะพบว่าชุดข้อมูลที่ใหญ่กว่าบนฮาร์ดแวร์ที่น่ากลัวยิ่งกว่านั้นก็ทำให้การค้นพบของวันที่เกินจริงเกินจริง
สำหรับคุณทุกคนที่ทำงานกับระบบเรียกเก็บเงินหรือเครื่องปั่นไฟอีเมลขยะ (อัปยศที่คุณ) และตั้งมืออย่างไม่เกรงกลัวกับแป้นพิมพ์เพื่อบอกฉันว่าคุณรู้ดีว่า denormalisation นั้นเร็วกว่าขออภัย แต่คุณใช้ชีวิตในแบบพิเศษ กรณี - โดยเฉพาะกรณีที่คุณประมวลผลข้อมูลทั้งหมดตามลำดับ ไม่ใช่กรณีทั่วไปและคุณมีความชอบธรรมในกลยุทธ์ของคุณ
คุณไม่ได้เป็นธรรมในการพูดจาเท็จ ดูส่วนท้ายของบันทึกย่อสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ denormalisation ที่เหมาะสมในสถานการณ์จำลองคลังข้อมูล
ฉันต้องการที่จะตอบสนอง
เข้าร่วมเป็นเพียงผลิตภัณฑ์คาร์ทีเซียนที่มีลิปกลอสบางส่วน
สิ่งที่โหลดของ bollocks ข้อ จำกัด จะถูกนำมาใช้โดยเร็วที่สุดเท่าที่จะทำได้ คุณได้อ่านทฤษฎีแล้ว แต่คุณยังไม่เข้าใจ ผนึกกำลังรับการรักษาเป็น "ผลิตภัณฑ์คาร์ทีเซียนที่ภาคสมัคร" เท่านั้นโดยการเพิ่มประสิทธิภาพการค้นหา นี่คือการแสดงสัญลักษณ์ (การทำให้เป็นมาตรฐานในความเป็นจริง) เพื่ออำนวยความสะดวกในการสลายสัญลักษณ์เพื่อให้เครื่องมือเพิ่มประสิทธิภาพสามารถสร้างการแปลงที่เทียบเท่าทั้งหมดและจัดอันดับตามต้นทุนและการเลือกเพื่อให้สามารถเลือกแผนแบบสอบถามที่ดีที่สุด
วิธีเดียวที่คุณจะได้รับเครื่องมือเพิ่มประสิทธิภาพในการผลิตผลิตภัณฑ์คาร์ทีเซียนคือการล้มเหลวในการจัดหาภาคแสดง: SELECT * FROM A,B
หมายเหตุ
David Aldridge ให้ข้อมูลเพิ่มเติมที่สำคัญบางอย่าง
แน่นอนว่ามีกลยุทธ์อื่น ๆ ที่หลากหลายนอกเหนือจากดัชนีและการสแกนตารางและเครื่องมือเพิ่มประสิทธิภาพที่ทันสมัยจะมีค่าใช้จ่ายทั้งหมดก่อนที่จะสร้างแผนการดำเนินการ
คำแนะนำที่ใช้งานได้จริง: หากสามารถใช้เป็นคีย์ต่างประเทศได้ให้ทำดัชนีเพื่อให้กลยุทธ์ดัชนีพร้อมใช้งานสำหรับเครื่องมือเพิ่มประสิทธิภาพ
ฉันเคยฉลาดกว่าเครื่องมือเพิ่มประสิทธิภาพ MSSQL ที่เปลี่ยนสองรุ่นที่ผ่านมา ตอนนี้มันทั่วไปสอนฉัน ในความเป็นจริงมันเป็นระบบผู้เชี่ยวชาญที่รวบรวมภูมิปัญญาทั้งหมดของคนที่ฉลาดมาก ๆ ในโดเมนที่ปิดอย่างพอเพียงว่าระบบที่ใช้กฎนั้นมีประสิทธิภาพ
"Bollocks" อาจไม่มีไหวพริบ ฉันถูกขอให้เป็นคนหยิ่งยโสและเตือนว่าคณิตศาสตร์ไม่ได้โกหก นี่เป็นเรื่องจริง แต่ไม่ควรนำมาใช้กับแบบจำลองทางคณิตศาสตร์ทั้งหมด รากที่สองของจำนวนลบนั้นมีประโยชน์มากถ้าคุณหลีกเลี่ยงการตรวจสอบความไร้สาระของพวกเขา (ปุ่นที่นั่น) และทำให้แน่ใจว่าคุณยกเลิกพวกเขาทั้งหมดก่อนที่จะพยายามตีความสมการของคุณ
เหตุผลที่ฉันตอบกลับอย่างโหดเหี้ยมก็คือคำแถลงดังที่กล่าวไว้นั้น
เข้าร่วมเป็นผลิตภัณฑ์คาร์ทีเซียน ...
นี่อาจไม่ใช่สิ่งที่ตั้งใจ แต่เป็นสิ่งที่เขียนขึ้นและมันไม่จริงอย่างเด็ดขาด ผลิตภัณฑ์คาร์ทีเซียนคือความสัมพันธ์ เข้าร่วมเป็นฟังก์ชั่น โดยเฉพาะอย่างยิ่งการเข้าร่วมเป็นฟังก์ชั่นค่าความสัมพันธ์ ด้วยคำกริยาว่างเปล่ามันจะสร้างผลิตภัณฑ์คาร์ทีเซียนและตรวจสอบว่ามันทำเช่นนั้นคือการตรวจสอบความถูกต้องหนึ่งครั้งสำหรับเครื่องมือเคียวรีฐานข้อมูล แต่ไม่มีใครเขียนการรวมที่ไม่มีข้อ จำกัด ในทางปฏิบัติ
ฉันเรียกสิ่งนี้ออกมาเพราะฉันไม่ต้องการให้ผู้อ่านตกหลุมพรางโบราณของโมเดลที่สับสนกับสิ่งที่สร้างแบบจำลอง แบบจำลองเป็นการประมาณค่าแบบง่ายโดยเจตนาสำหรับการจัดการที่สะดวก
การตัดสำหรับการเลือกกลยุทธ์การเข้าร่วมการสแกนตารางอาจแตกต่างกันระหว่างเอ็นจิ้นฐานข้อมูล มันเป็นผลมาจากจำนวนของการตัดสินใจดำเนินการเช่นต้นไม้โหนดเติมปัจจัยขนาดของคีย์ที่มีมูลค่าและรายละเอียดปลีกย่อยของอัลกอริทึม แต่พูดกว้างการจัดทำดัชนีที่มีประสิทธิภาพสูงมีเวลาการดำเนินการของkบันทึกn + ค เทอม C เป็นค่าใช้จ่ายคงที่ส่วนใหญ่ใช้เวลาตั้งค่าและรูปร่างของเส้นโค้งหมายความว่าคุณจะไม่ได้รับผลตอบแทน (เทียบกับการค้นหาเชิงเส้น) จนกระทั่งnอยู่ในร้อย
บางครั้ง denormalisation เป็นความคิดที่ดี
Denormalisation คือความมุ่งมั่นในกลยุทธ์การเข้าร่วมโดยเฉพาะ ดังกล่าวก่อนหน้านี้รบกวนกับกลยุทธ์การเข้าร่วมอื่น ๆ แต่ถ้าคุณมีที่เก็บข้อมูลในดิสก์รูปแบบการเข้าถึงที่คาดการณ์ได้และแนวโน้มที่จะประมวลผลมากหรือทั้งหมดการคำนวณการเข้าร่วมล่วงหน้านั้นคุ้มค่ามาก
นอกจากนี้คุณยังสามารถกำหนดเส้นทางการเข้าถึงที่การดำเนินงานของคุณใช้และรวมการเข้าร่วมทั้งหมดสำหรับเส้นทางการเข้าถึงเหล่านั้นล่วงหน้า นี่คือหลักฐานเบื้องหลังคลังข้อมูลหรืออย่างน้อยก็เมื่อพวกเขาสร้างขึ้นโดยคนที่รู้ว่าทำไมพวกเขาถึงทำในสิ่งที่พวกเขากำลังทำและไม่เพียงเพื่อความสอดคล้องของคำศัพท์
คลังข้อมูลที่ได้รับการออกแบบอย่างเหมาะสมนั้นผลิตขึ้นเป็นระยะ ๆ โดยการแปลงจำนวนมากออกจากระบบประมวลผลธุรกรรมปกติ การแยกการดำเนินงานและฐานข้อมูลการรายงานนี้มีผลที่พึงประสงค์อย่างมากในการขจัดความขัดแย้งระหว่าง OLTP และ OLAP (การประมวลผลธุรกรรมออนไลน์เช่นการป้อนข้อมูลและการประมวลผลการวิเคราะห์ออนไลน์เช่นการรายงาน)
จุดสำคัญที่นี่เป็นที่นอกเหนือจากการปรับปรุงเป็นระยะคลังข้อมูลที่มีการอ่านเท่านั้น วาทกรรมนี้ทำให้สงสัยคำถามของการปรับปรุงความผิดปกติ
อย่าทำผิดพลาดในการทำให้ฐานข้อมูล OLTP ของคุณเสื่อมสภาพ (ฐานข้อมูลที่มีการป้อนข้อมูลเกิดขึ้น) อาจเร็วกว่าสำหรับการเรียกเก็บเงิน แต่ถ้าคุณทำเช่นนั้นคุณจะได้รับความผิดปกติในการอัปเดต เคยลอง Reader's Digest แล้วหยุดส่งของหรือเปล่า
พื้นที่ว่างในดิสก์มีราคาถูกในทุกวันนี้ แต่การทำให้เป็นปกติเป็นเพียงส่วนหนึ่งของเรื่องราวสำหรับคลังข้อมูล การเพิ่มประสิทธิภาพที่ใหญ่กว่ามากนั้นมาจากค่าสะสมที่คำนวณล่วงหน้าแล้ว: ผลรวมรายเดือน, สิ่งนั้น มันมักจะเกี่ยวกับการลดการตั้งค่าการทำงาน
ปัญหา ADO.NET ที่มีชนิดไม่ตรงกัน
สมมติว่าคุณมีตาราง SQL Server ที่มีคอลัมน์ที่จัดทำดัชนีประเภท varchar และคุณใช้ AddWithValue เพื่อส่งผ่านพารามิเตอร์ที่ จำกัด การสืบค้นในคอลัมน์นี้ สตริง C # เป็น Unicode ดังนั้นประเภทพารามิเตอร์ที่อนุมานจะเป็น NVARCHAR ซึ่งไม่ตรงกับ VARCHAR
VARCHAR to NVARCHAR เป็นการแปลงที่กว้างขึ้นดังนั้นมันจึงเกิดขึ้นโดยปริยาย - แต่บอกลาการทำดัชนีและขอให้โชคดีว่าทำไม
"นับจำนวนครั้งที่พบดิสก์" (Rick James)
หากทุกอย่างถูกแคชใน RAM JOINs
จะค่อนข้างถูก การทำให้เป็นมาตรฐานไม่ได้มีโทษประสิทธิภาพมากนักลงโทษประสิทธิภาพ
หาก schema "normalized" ทำให้JOINs
ดิสก์มีจำนวนมาก แต่สกีมา "denormalized" ที่เทียบเท่าจะไม่ต้องกดดิสก์จากนั้น denormalization จะชนะการแข่งขันด้านประสิทธิภาพ
ความคิดเห็นจากผู้แต่งดั้งเดิม: เอ็นจิ้นฐานข้อมูลที่ทันสมัยมีความสามารถในการจัดลำดับการเข้าถึงเพื่อลดการพลาดแคชระหว่างการเข้าร่วม ข้างต้นในขณะที่ความจริงอาจถูกควบคุมผิดเนื่องจากเป็นการรวมที่จำเป็นต้องมีราคาแพงอย่างมีปัญหากับข้อมูลขนาดใหญ่ สิ่งนี้จะนำไปสู่การตัดสินใจที่ไม่ดีในส่วนของนักพัฒนาที่ไม่มีประสบการณ์