طريقة سريعة لتحديد ما إذا كان هناك حقل في جدول أوراكل

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

  •  21-09-2019
  •  | 
  •  

سؤال

أنا أبحث عن جملة SQL سريعة لتحديد متى يوجد حقل أم لا في جدول.

في الواقع أنا أستخدم هذه الجملة

Select 1 
   from dual
   where exists (select 1 
                   from all_tab_columns 
                  where table_name = 'MYTABLE' 
                    and column_name = 'MYCOLUMN')

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

تحديث

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

يحتوي الجدول على all_tab_columns على أكثر من مليون سجل.

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

المحلول

المفتاح الأساسي all_tab_columns هو owner, table_name, column_name لذا فإن البحث عن مالك معين سيكون أسرع (أو استخدام user_tab_columns).

نصائح أخرى

أقترح قراءة مقالة AskTom هذه. ويوضح أن أسرع طريقة للتحقق هي عدم التحقق على الإطلاق.

http://asktom.oracle.com/pls/asktom/f؟p=100:11:0:::::P11_Question_id:698008000346356376

الاستعلام عن قاموس بيانات Oracle - كما هو الحال بالفعل ، هو الأسرع.

يتم تخزين قاموس البيانات في الذاكرة ويجب أن يكون قادرًا على تلبية الاستعلام بسرعة كبيرة. قد تكون قادرًا على الحصول على نتائج أسرع قليلاً إذا كنت تعرف مالك المخطط الفعلي للجدول - حتى لا تتحمل تكلفة البحث مقابل جميع المخططات.

هذا الاستعلام يكفي:

 SELECT null
  FROM user_tab_columns
 WHERE table_name = 'MYTABLE' and column_name = 'MYCOLUMN'

أسرع طريقة الوحيدة هي الاستعلام مباشرة من الجداول الداخلية التي ليست طريقة موصى بها وتحتاج إلى منح على كائنات sys:

select null
from sys.col$ c
   , sys.obj$ o
   , sys.obj$ ot
where o.name = 'MYTABLE'
  and c.name = 'MYCOLUMN'
  and o.obj# = c.obj#
  and o.owner# = userenv('SCHEMAID')
  and ot.type#(+) = 13
  and (o.type# in (3, 4)                                    
       or
       (o.type# = 2 
        and
        not exists (select null
                      from sys.tab$ t
                     where t.obj# = o.obj#
                       and (bitand(t.property, 512) = 512 or
                            bitand(t.property, 8192) = 8192))))

هذا الاستعلام مأخوذ من USER_TAB_COLUMNS التعريف و يمكن أن يتغير عبر إصدارات مختلفة (10gr2 في حالتي). في هذا الاستعلام ، قطعت الإشارات إلى المعلومات التي لم تطلبها.

على أي حال ، لماذا تريد التحقق من هذا؟

سيعطي استعلام SQL هذا الاسم لجميع الجدول الذي يحتوي على عمود "Navigation_id" للمستخدم "dsgidev"

حدد * من all_tab_cols حيث column_name = 'navigation_id' و owner = 'dsgidev'

لذا ، قم بتغيير اسم العمود باستخدام العمود الذي تريد البحث فيه والمالك باسم معرف المالك الخاص بك.

EZ ، أسرع طريقة هي مجرد إنشاء وظيفة مثل هذه:

  Create function exist(v_table in varchar2, v_col in  varchar2) 
 Return integer is
 Res integer:= 0;
 Begin
   Begin
      Execute immediate 'select ' || v_col || ' from '|| v_table;         
      Res:=1;
      Exception when other then null;
   End;
Return (res);
End;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top