sql أوراكل 12c-هو مؤشر على عمود "رقم" يؤدي بشكل أسرع من المؤشر في العمود "فارتشار"؟



oracle indexing (1)

لنفترض أن لدي جدولا في أوراكل 12c يحتوي على أعمدة:

create table t1 (
a number (5,0),
b varchar (5,0)
d ...
e ...
);

ثم أدخل 100،000،000 السجلات في كلا العمودين التي لها نفس القيم - على سبيل المثال

20151 and '20152' ... (for a first record)
20152 and '20152' ... (for a second record)
20153 and '20153' ... (for a third record)
...

ثم أضف الفهرس 1 في العمود 'a' والفهرس 2 في العمود 'b'.

السؤال - هل يؤدي الاستعلام أداء متساويا بالتساوي عند تنفيذ العمود 'a' كما هو الحال في العمود 'b' (على سبيل المثال، join الاستعلام مع جدول آخر استنادا إلى عمود 'a' أو استنادا إلى بند 'b' أو WHERE على أي من الأعمدة)؟

أيضا - استخدام الفهرس على عمود ' varchar ' - استخدام وحدة المعالجة المركزية أكثر من استخدام الفهرس على عمود 'رقم'؟

شكر.

https://code.i-harness.com


[تل؛ در] استخدم التواريخ لتخزين التواريخ والأرقام لتخزين الأرقام والسلاسل لتخزين السلاسل.

ماذا عن استخدام الموارد؟

تخزن أوراكل نوع NUMBER البيانات ك 1 بايت لكل رقمين.

تخزن أوراكل نوع بيانات CHAR ك 1 بايت لكل حرف أسي (قد يتطلب أوتف-8 والترميزات الأخرى المزيد من الأحرف في مجموعات موسعة)، كما سيؤدي إلى وضع السلسلة بشكل صحيح بحروف مسافات بحيث تكون السلاسل كلها بنفس الطول تماما.

تخزن أوراكل VARCHAR2 بيانات VARCHAR2 ك 1 بايت لكل حرف أسي بالإضافة إلى سماح صغير (1 أو 2 بايت) لطول السلسلة.

تخزن أوراكل نوع بيانات DATE أنه 7 بايت (2 في السنة و 1 لكل شهر، يوم، ساعة، دقيقة، ثانية).

استنادا إلى السؤال السابق الخاص بك يبدو أن تخزين year quarter وعلى افتراض أن كنت دائما سوف يكون لها أربعة أرقام وأرباع من 1 أرقام ثم:

  • NUMBER(5,0) سوف يستغرق 3 بايت؛
  • CHAR(5 CHARACTER) سوف يستغرق 5 بايت؛
  • VARCHAR2(5 CHARACTER) سوف يستغرق 6 بايت؛ و
  • سيستغرق ديت 7 بايت.

لذلك فقط النظر في الذاكرة NUMBER(5,0) سيكون الأكثر كفاءة.

ومع ذلك

بمجرد أن تبدأ في القيام الحساب على السنة / أرباع المخزنة كأرقام / سلاسل ثم تحصل في قضايا الأداء:

على سبيل المثال، الحصول على الربع التالي:

  • إذا كان quarter هو NUMBER نوع البيانات ثم يمكنك استخدام: CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END ولكن هذا لا يعالج عندما تريد إضافة 5 أرباع أو بدء طرح أرباع ثم يبدأ المنطق للحصول على أكثر تعقيدا بكثير.
  • إذا كان quarter هو نوع بيانات CHAR ثم يمكنك تحويله إلى عدد أو تاريخ واستخدام أي من تلك الأساليب (التلاعب سلسلة من غير المرجح أن يكون بيرفورمانت).
  • إذا كان quarter هو DATE ثم تحتاج فقط إلى استخدام ADD_MONTHS( quarter, 3 ) .

الأسلوب DATE هو التوثيق الذاتي موجود بالفعل في حين أن أسلوب NUMBER ستصبح مجرد دالة مخصصة لتقريب نوع بيانات QUARTER وبمجرد تنفيذ كافة وظائف المقارنة والتلاعب تحتاج إلى إعادة كتابة فعال نوع البيانات DATE كما (أودت) للأرباع وهذه الوظائف ستكون أقل بروفومانت من وظائف التاريخ الأمثل.

لا تستخدم أنواع البيانات غير المناسبة - مجرد تخزين التواريخ والتواريخ؛ أرقام كأرقام. وسلاسل كما سلسلة.





numbers