هل يؤدي إنشاء مفتاح أساسي في أعمدة متعددة إلى إنشاء فهارس لها جميعًا؟

StackOverflow https://stackoverflow.com/questions/532037

سؤال

إذا قمت بتعيين مفتاح أساسي في أعمدة متعددة في Oracle، فهل أحتاج أيضًا إلى إنشاء الفهارس إذا كنت بحاجة إليها؟

أعتقد أنه عند تعيين المفتاح الأساسي واحد العمود، لقد تم فهرسته به؛هل هو نفسه مع PKs متعددة الأعمدة؟

شكرًا

هل كانت مفيدة؟

المحلول

لا، لن يتم إنشاء فهارس للحقول الفردية.

إذا كان لديك مفتاح مركب FieldA وFieldB وFieldC وأنت

select * from MyTable where FieldA = :a 

أو

select * from MyTable where FieldA = :a and FieldB = :b

ثم سيستخدم هذا الفهرس (لأنهما أول حقلين في المفتاح)

اذا كنت تمتلك

select * from MyTable where FieldB = :b and FieldC = :c

عندما تستخدم أجزاء من الفهرس، ولكن ليس الفهرس الكامل، سيتم استخدام الفهرس بكفاءة أقل من خلال فحص تخطي الفهرس، أو فحص الفهرس الكامل، أو فحص الفهرس الكامل السريع.

(شكرًا لديفيد الدريدج على التصحيح)

نصائح أخرى

إذا قمت بإنشاء مفتاح أساسي على الأعمدة (A، B، C) فستقوم Oracle افتراضيًا بإنشاء فهرس فريد على (A، B.ج).يمكنك إخبار Oracle باستخدام فهرس موجود مختلف (ليس بالضرورة فريدًا) مثل هذا:

alter table mytable add constraint mytable_pk 
primary key (a, b, c)
using index mytable_index;

سوف تحصل على فهرس واحد عبر أعمدة متعددة، وهو ليس مثل وجود فهرس في كل عمود.

المفتاح الأساسي يعني إنشاء ملف composite unique index على أعمدة المفاتيح الأساسية.

يمكنك استخدام مسار وصول خاص يسمى INDEX SKIP SCAN لاستخدام هذا الفهرس مع المسندات التي لا تتضمن العمود المفهرس الأول:

SQL> CREATE TABLE t_multiple (mul_first INTEGER NOT NULL, mul_second INTEGER NOT NULL, mul_data VARCHAR2(200))
  2  /
Table created

SQL> ALTER TABLE t_multiple ADD CONSTRAINT pk_mul_first_second PRIMARY KEY (mul_first, mul_second)
  2  /
Table altered

SELECT  /*+ INDEX_SS (m pk_mul_first_second) */
    *
FROM    t_multiple m
WHERE   mul_second = :test 

SELECT STATEMENT, GOAL = ALL_ROWS                            
 TABLE ACCESS BY INDEX ROWID       SCOTT    T_MULTIPLE
  INDEX SKIP SCAN                  SCOTT    PK_MUL_FIRST_SECOND

المفتاح الأساسي هو فهرس واحد فقط (فريد)، وربما يحتوي على أعمدة متعددة

بالنسبة إلى B، سيتم استخدام الفهرس المحدد إذا كان العمود أ يحتوي على أصل منخفض فقط (على سبيل المثال:لها قيمتان فقط).بشكل عام، كان من الممكن أن تخمن هذه الإجابة إذا تخيلت أن الأعمدة لم يتم فهرستها بشكل منفصل، ولكن سلسلة من الأعمدة مفهرسة (هذا ليس صحيحًا تمامًا، ولكنه يعمل مع التقريب الأول).لذا فهو ليس فهرسًا ب، بل هو أشبه بفهرس ||ب.

قد تحتاج إلى تعيين فهارس فردية على الأعمدة اعتمادًا على بنية المفتاح الأساسي لديك.

ستقوم المفاتيح والفهارس الأساسية المركبة بإنشاء فهارس بالطريقة التالية.لنفترض أن لدي الأعمدة A وB وC وأقوم بإنشاء المفتاح الأساسي على (A وB وC).سيؤدي هذا إلى الفهارس

  • (أ، ب، ج)
  • (أ، ب)
  • (أ)

تقوم Oracle بالفعل بإنشاء فهرس على أي من مجموعات الأعمدة الموجودة في أقصى اليسار.لذا...إذا كنت تريد فهرسًا في العمود B فقط، فسيتعين عليك إنشاء فهرس له بالإضافة إلى المفتاح الأساسي.

ملاحظة.أعلم أن MySQL يعرض هذا السلوك الأكثر تركًا وأعتقد أن SQL Server هو أيضًا الأكثر تركًا

في أوراكل، هذا ليس بيانا دقيقا.يقوم بإنشاء فهرس واحد فقط على (A,B,C).لا يقوم بإنشاء فهارس (A وB) و(A).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top