سوال  4️⃣ چگونه میتوان در حجم زیاد داده ها سطرهایی را حذف یا اصلاح کرد ؟
✔️ برای پاسخ به این سوال باید اطلاعاتی راجع به مفهوم 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 نیز توسعه داد