منبع اصلی نوشتار زیر در این لینک قرار دارد

نمایش کل متن sql از v$sql

خیلی وقتها که میخوایم وضعیت SQL STATEMENTهایی که یوزرها زدن رو ببینیم از ویوی V$SQL و معمولاً از کوئری‌ای شبیه زیر استفاده میکنیم:

select v.SQL_TEXT,
v.PARSING_SCHEMA_NAME,
v.FIRST_LOAD_TIME,
v.DISK_READS,
v.ROWS_PROCESSED,
v.ELAPSED_TIME,
v.service
from v$sql v
where to_date(v.FIRST_LOAD_TIME,'YYYY-MM-DD hh24:mi:ss')>ADD_MONTHS(trunc(sysdate,'MM'),-2)

نکته: WHERE تو کوئری بالا به صورت اختیاریه ولی درکل یادمون باشه میتونیم با استفاده از فیلد FIRST_LOAD_TIME رو تاریخ و زمان اجرای اون کوئری مانور بدیم تا گزارشهای بهتری داشته باشیم.

همونطور که می‌بینید ما اکثر مواقع از فیلد SQL_TEXT استفاده میکنیم ولی با توجه به اینکه میدونیم محدودیت کاراکتری VARCHAR2 دقیقا ۱۰۰۰ کاراکتره احتمالا خیلی از دستورات رو نمیتونیم به صورت کامل ببینیم

اینجاست که بهتره بدونیم V$SQL و V$SQLAREA شامل فیلدی به اسم SQL_FULLTEXT هستن که این فیلد تمام دستور SQL کاربر رو تو دیتاتایپ CLOB ذخیره میکنه پس میشه رشته‌ها رو تا حداکثر سایزی که یک STATEMENT میتونه باشه رو نشون داد(۴۰۰۰ کاراکتر) بیاین باهم ببینیم که چجوری میشه رشته‌ها رو از این فیلد استخراج کرد.

set linesize 132 pagesize 999
column sql_fulltext format a60 word_wrap
break on sql_text skip 1

select
replace(translate(sql_fulltext,'0123456789','999999999'),'9','')
SQL_FULLTEXT
from v$sql
where sql_text like '%TEXT IDENTIFIER%'
group by replace(translate(sql_fulltext,'0123456789','999999999'),'9','')
/

خروجی این دستور میتونه به این شکل باشه:

SQL_FULLTEXT 
------------------------------------------------------------ 
select /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
... query text ...
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */ from b

امیدوارم براتون مفید باشه

ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

انواع Data Type در Oracle Database 11g

  • varchar استاندارد ANSI داره
  • varchar2 استاندارد oracle رو داره (ماکزیمم 4000 بایت تو 11g و 32767 بایت تو 12c)
  • char به صورت ماکزیمم 255 بایت یا کاراکتر رو ساپورت میکنه
  • nvarchar2 به صورت ماکزیمم 2000 بایت یا کاراکتر
  • number به صورت ماکزیمم ۳۸ رقم
  • date شامل “قرن، سال، ماه، روز، ساعت، دقیقه، ثانیه” داره
  • timestamp تمام date رو داره بعلاوه اینکه ثانیه تا ۹ رقم ریزتر هم میشه
  • long برای کاراکتر استفاده میشه و ماکزیمم اون ۲ گیگ‌ه
  • long raw برای فایلهای باینری هستش و برای فایل‌های pdf, doc, mp3, avi, dll, … هستش ماکزیمم ۲ گیگ

LOBs یا همون Large Objects

  • clob به صورت کاراکتره و ماکزیمم ۴ گیگ‌ه
  • nclob به صورت کاراکتر با ساپورت کاراکترهای national و ماکزیمم ۴ گیگ‌ه
  • blob به صورت binary برای فایلهای باینری هستش و برای فایل‌های pdf,rtf, doc, mp3, avi, dll, … هستش، ماکزیمم ۴ گیگ
  • bfile در این type فایل‌ها به صورت اکسترنال و روی OS قرار داردند و درون bfile اشاره‌گر به فایل قرار دارد، ماکزیمم ۴ گیگ
  • securefile همون blob با سرعت و کارایی بیشتر

تفاوت بین long و long raw و LOBها

1:

اگه فیلدهای جدول شما به صورت زیر باشه به طور قطع شما موقع ساخت جدول به مشکل میخورید:

create table e(
e_id number(20),
f_name varchar(40 char),
...,
...,
cv long,
img long raw
);

نکته اینجاست که در یک جدول ۲ فیلد long نمیتوان داشت

2:

سرعت خوندن در log و LOBها متفاوته

در حقیقت long و long raw به صورت sequencial از حافظه میخونن(سریالی) و LOBها به صورت random access(مستقیم)

3:

در اوراکل با contex index یا همون oracle text میشه فیلدهای blob رو به صورت لغت به لغت ایندکس‌گذاری کرد همچنین به طور کامل از فارسی پشتیبانی میکنه

نکته: روز فیلدهای blob و clob نمیتوان index معمولی (b-tree ,bitmap) گذاشت

نکته: اگه فایل pdf داشته باشید context index نمیتونه فارسی‌ها رو ایندکس بکنه و فقط انگلیس‌ها رو ایندکس میکنه

4:

ذخیره فایلهای باینری مثل فیلم و موزیک در bfile عملکرد بهتری نسبت به فقط ذخیره آدرس فایل در varchar یا … دارد

مثلا فرض کنید OS ما ویندوزه و فایلهای ما هم در درایوهای ویندوز قرار داره پس موقع ذخیره آدرس فایل در varchar آدرس فایلها به صورت ویندوزی است در این حالت اگه مسیر فایلها رو عوض کنیم کل مسیرهای ذخیره شده در دیتابیس هم باید عوض شود همچنین اگه سیستم‌عاملمون رو عوض کنیم و به unix baseها یا unix likeها که از استاندارد POSIX استفاده میکنن بریم دوباره کل مسیرها باید عوض شوند تازه اگه فایلها تو انتقال طبقه‌بندی و از هم جدا بشن درست کردن مسیرها بسیار کار مشکلی خواهد بود

برای رهایی از این مشکلات از bfile استفاده می‌کنیم و با ایجاد یک آبجکت دایرکتوری در دیتابیس مسیر فایلها رو ذخیره می‌کنیم در این رویکرد اگه سیستم‌عامل عوض شود یا بخوایم مسیر رو عوض کنیم فقط مسیر دایرکتوری رو عوض می‌کنیم

مزیت دیگه bfile نسبت به varchar برای ذخیره آدرس فایلها اینه که میتونیم رو فایلها ایندکس بذاریم(مثلا ایندکس روی doc, docx, rtf, …) در صورتی که اگه از نوع varchar باشه فقط روی رشته‌ها ایندکس انجام میشه

اگه blob رو به bfile ببریم اولین مشکل میتونه تو خراب شدن پسوند فایلها در OS به وجود بیاد، دومین مشکل سر export گیری هستش اگه فایلها توی blob باشن با یه export تمام فایلها هم بک‌آپ گرفته میشن همچنین حجم بک‌آپ بالاتر میره

char

وقتی از data type char استفاده می‌کنید داده‌ها تو حافظه به صورت fix ذخیره می‌شوند

(پس سایز char به صورت fix ‌است) مثلاً:

Mahdi char(20) => ‘Mahdi              ‘

مشکلات char

  • اشغال زیاد حافظه
  • مشکل در index و sort
  • مشکل در select (حتما باید موقع select ما trim کنیم رشته ورودی رو)
create table employees(
    employee_id number(10),
    f_name varchar2(40 char)
)

تو فیلد اول type ما در حقیقت 10 بایت‌ه و تعداد کاراکترهاش بسته به character set دیتابیس داره

و تو فیلد دوم type ما دقیقاً 40 کاراکتره

ادامه مطلب