ฉันต้องสร้างดัชนีบนคีย์ต่างประเทศบน Oracle หรือไม่


121

ผมมีตารางและตาราง A มีคีย์ต่างประเทศกับในคีย์หลัก 's,BABBB_ID

ด้วยเหตุผลบางอย่าง (ฉันรู้ว่ามีเหตุผลที่ถูกต้อง) มันไม่ได้ใช้ดัชนีเมื่อฉันเข้าร่วมสองตารางนี้กับคีย์

ฉันจำเป็นต้องสร้างดัชนีแยกต่างหากA.B_IDหรือการมีอยู่ของคีย์ต่างประเทศให้ข้อมูลนั้น?

คำตอบ:


138

ข้อ จำกัด คีย์ภายนอกเพียงอย่างเดียวไม่ได้ให้ดัชนีบน Oracle - ต้องสร้าง (และควร) อย่างเดียว


11
ในบางฐานข้อมูลที่สร้างข้อ จำกัด คีย์ต่างประเทศจะสร้างดัชนี ... เช่น Jet Engine (ไฟล์ MSAccess, Firebird และ MySQL)
bubi

17
คำตอบนี้ไม่มีความหมายหากไม่ได้อ้างถึงการใช้งานฐานข้อมูลอย่างชัดเจน แน่ใจว่ามีการติดแท็กคำถามoracleแต่ไม่ชัดเจนในทันทีเมื่อคุณมาที่นี่จากการค้นหาโดย Google
developerbmw

5
ฉันสามารถยืนยันได้ว่า PostgreSQL - อย่างน้อยก็ในช่วงเวลาของโพสต์นี้ - ไม่ได้ทำโดยอัตโนมัติ
The Dembinski

คำตอบเดียวกันสำหรับ SQL Server (2016, Azure ... ) เท่าที่ฉันรู้
Pac0

เหตุใดจึงต้องสร้างดัชนีด้วยคีย์ภายนอกด้วย Oracle ผลที่ตามมาของการไม่ทำเช่นนั้นคืออะไร?
ĐỗCôngBằng

46

การสร้างคีย์นอกไม่ได้สร้างดัชนีบน A.B_ID โดยอัตโนมัติ ดังนั้นโดยทั่วไปแล้วมันจะสมเหตุสมผลจากมุมมองของประสิทธิภาพการสืบค้นเพื่อสร้างดัชนีแยกต่างหากบน A.B_ID

หากคุณเคยลบแถวใน B คุณต้องการให้ A.B_ID จัดทำดัชนี มิฉะนั้น Oracle จะต้องทำการสแกนแบบเต็มตารางบน A ทุกครั้งที่คุณลบแถวออกจาก B เพื่อให้แน่ใจว่าไม่มีเรกคอร์ดที่ถูกทอดทิ้ง (ขึ้นอยู่กับเวอร์ชัน Oracle อาจมีผลกระทบในการล็อกเพิ่มเติมเช่นกัน แต่จะลดน้อยลง ใน Oracle เวอร์ชันล่าสุด)


1
คอลัมน์ PFK ล่ะ ตัวอย่างเช่นถ้าฉันมีตารางกลางสำหรับความสัมพันธ์แบบกลุ่มต่อกลุ่มฉันสร้างดัชนีสำหรับคอลัมน์ PFK สองคอลัมน์ของตารางนี้หรือไม่
Clamari

3
@Clamari - หาก C มีคีย์หลักของ (A_ID, B_ID) คีย์หลักจะดูแลความสามารถในการลบออกจาก A. ถ้าคุณยังต้องการที่จะสามารถที่จะลบออกจาก B B_IDได้อย่างมีประสิทธิภาพที่คุณต้องการดัชนีใน
Justin Cave

25

สำหรับข้อมูลเพิ่มเติม: Oracle ไม่สร้างดัชนีโดยอัตโนมัติ (เช่นเดียวกับข้อ จำกัด เฉพาะ) เนื่องจาก (a) ไม่จำเป็นต้องบังคับใช้ข้อ จำกัด และ (b) ในบางกรณีคุณไม่จำเป็นต้องใช้

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

เมื่อใดก็ตามที่แอปพลิเคชันจำเป็นต้องสามารถลบแถวในตารางหลักหรืออัปเดตค่า PK (ซึ่งหายากกว่า) DML จะได้รับผลกระทบหากไม่มีดัชนีเนื่องจากจะต้องล็อกตารางลูกทั้งหมด

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


14

SQL Server ไม่เคยใส่ดัชนีลงในคอลัมน์คีย์ต่างประเทศโดยอัตโนมัติลองดูบล็อกโพสต์ที่ยอดเยี่ยมของ Kim Tripp เกี่ยวกับเบื้องหลังและประวัติความเป็นมาของตำนานเมืองนี้

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


8

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

แต่

มีฐานข้อมูลบางส่วนที่สร้างดัชนีบนคีย์ต่างประเทศโดยอัตโนมัติแล้ว Jet Engine (ไฟล์ Microsoft Access) Firebird MySQL

อย่างแน่นอน

SQL Server Oracle

ไม่


3
ขอบคุณสำหรับการกล่าวถึงว่า FIrebird SQL ทำโดยอัตโนมัติ นั่นคือจุดที่ฉันกำลังมองหา
user424855

1

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

สิ่งที่สำคัญที่สุดในที่นี้ดูเหมือนจะเป็นการเลือก: หากค่าในดัชนีมีความซ้ำกันมากก็อาจให้ประสิทธิภาพที่ดีกว่าในการวางดัชนี (ถ้าเป็นไปได้) และอนุญาตให้มีการสแกนตาราง


1

ข้อ จำกัด ที่ไม่ซ้ำกันคีย์หลักและคีย์ต่างประเทศสร้างดัชนีที่บังคับใช้หรือ "ย้อนกลับ" ข้อ จำกัด (และบางครั้งเรียกว่าดัชนีสำรอง) ข้อ จำกัด ของคีย์หลักสร้างดัชนีที่ไม่ซ้ำกัน ข้อ จำกัด ของ FOREIGN KEY สร้างดัชนีที่ไม่ซ้ำกัน ข้อ จำกัด UNIQUE สร้างดัชนีที่ไม่ซ้ำกันหากคอลัมน์ทั้งหมดไม่เป็นโมฆะและสร้างดัชนีที่ไม่ซ้ำกันหากคอลัมน์อย่างน้อยหนึ่งคอลัมน์เป็นโมฆะ ดังนั้นหากคอลัมน์หรือชุดคอลัมน์มีข้อ จำกัด UNIQUE, PRIMARY KEY หรือ FOREIGN KEY คุณไม่จำเป็นต้องสร้างดัชนีสำหรับคอลัมน์เหล่านั้นเพื่อประสิทธิภาพ



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