1

چگونه میتوان در حجم زیاد داده ها سطرهایی را حذف یا اصلاح کرد ؟

تعداد بازدید
160
زمان مطالعه
2 دقیقه
بـروز رسانـی
1402/06/31
پرینت مقاله
اشتراک گذاری

برای پاسخ به این سوال باید اطلاعاتی راجع به مفهوم rowid داشته باشید

👈 این ستون (rowid) یک شبه ستون است که در تمامی جداول وجود دارد برای دریافت مقدار rowid باید نام آن را ذکر کنیم

select rowid , e.* from employees e

👈 مقدار rowid به ازای هر سطر از پایگاه داه یکتا است ، یعنی نمیتوان در پایگاه داده هیچ دو سطری را پیدا کرد که دارای یک rowid باشد

👈 این شبه ستون (rowid) در واقع آدرس محل فیزیکی ذخیره سازی رکورد را مشخص میکند که شامل مولفه هایی از جمله: نوع شی + شناسه Data File + شناسه Block + …

👈 کاربرد اصلی rowid در ایجاد ایندکس ها است ، هر نود ایندکس از دو مولفه value و rowid تشکیل میشود ، هنگامی که از ستونی که دارای ایندکس است در where استفاده میکنیم ابتدا استفاده از value در نودهای ایندکس فیلتر انجام میشود و سپس با استفاده از rowid به سطرهای مورد نظر دسترسی پیدا میکند

وجود ایندکس همانطور که برای سرعت اجرای پرس و جو ها مفید است ، در انجام DML ها باعث کند شدن میشود چون به ازای دستور DML باید ایندکس جدول به روز رسانی شود (rebuild) مه این کار میتواند سرباری برای انجام دستورات DML بوجود بیاورد

در جداولی که تعداد تراکنش های بالایی دارند (TPS بالایی دارند) وجود ایندکس میتواند باعث کندی عملکرد DML ها شود لذا از حداقل ایندکس برای آنها استفاده میشود

راه حل مناسب برای حذف داده از جداول حجیمی که ایندکس هم ندارند استفاده از insted of trigger است ، لطفا به کدهای ذیل دقت نمایید

create or replace view vw_emp_complex as

select e.rowid ri,

       e.”employee_id”,

       e.”first_name”,

       e.”last_name”,

       e.”email”,

       e.”phone_number”,

       e.”hire_date”,

       e.”job_id”,

       e.”salary”,

       e.”commission_pct”,

       e.”manager_id”,

       e.”department_id”

  from employees e;

/—————————————————–/

create or replace trigger trg_insted_on_vw_emp_com

  instead of  update on vw_emp_complex

  for each row

begin

  update employees e set e.salary = :new.SALARY where e.rowid = :old.ri;

end trg_insted_on_vw_emp_com;

 ✔️ در بخش اول کدهای مشاهده شده یک view ایجاد شده است که rowid هر سطر جدول کارمندان در آن قرار داده شده است

✔️ در بخش دوم مدهای بالا یک insted of trigger بر روی view ایجاد شده تعریف شده است که در شرط آن از rowid استفاده شده است

✔️ برای اصلاح داده ها میتوان به صورت زیر عمل کرد

update vw_emp_complex c

   set c.salary = c.salary + 1100

 where c.department_id = 80

 ✔️ پس از اجرای دستور update وارد کدهای تریگر شده و به دلیل اینکه در تریگر از rowid استفاده کرده ایم به سرعت میتوانیم به رکوردهای مورد نظر دسترسی پیدا کرده و اصلاح را انجام دهد

✔️ همانطور که مشاهده میکنید تریگر فوق به ازای هر سطر از دستور update که بر روی view اجرا میشود فراخوانی میگردد ، میتوان تریگر فوق را برای دستور delete نیز توسعه داد

 

دانلود فایل PDF

دیدگاهتان را بنویسید

آیا این مقاله مفید بود؟

از ۱ تا ۵ چه امتیازی می‌دهید؟

میانگین امتیاز از رای

اولین نفر باشید که رای میدهد!

تماس با پشتیبانی
فرداوراکل
این فیلد برای اعتبار سنجی است و باید بدون تغییر باقی بماند .