اوراکل اپکس- union-oracle

 

بهبود کارایی UNION – UNION All در اوراکل

 

هنگام استفاده از UNION در اوراکل در صورتیکه در هر کدام از کوئریها رکورد تکراری وجود داشته باشد فقط یک رکورد از آن رکوردهای تکراری با کوئری دوم جمع بسته می شود.
بدین صورت است :
DISTINCT(DISTINCT (Q1) + DISTINCT (Q2)) = DISTINCT(Q1 + Q2)
هنگام استفاده از UNION ALL در اوراکل کل رکوردهای کوئری اول با کل رکوردهای کوئری دوم جمع بسته می شود
بدین صورت است :
 Q1 + Q2
به کوئری زیر توجه کنید: اشاره می شود که حتما باید یکطرف مقدار Not Null داشته باشد. چون کوئری زیر بی معنی می باشد
SELECT NULL FROM DUAL UNION SELECT NULL FROM DUAL

Result:
-
SELECT NULL FROM DUAL UNION ALL SELECT NULL FROM DUAL

Result:
-
-
درباره UNION Performance در اوراکل
در خصوص UNION در Oracle: بسیار بهینه سازی شده و واقعا سریع می باشد به جز در مواردی که یکی از کوئری ها در زمان طولانی قبل از دیگر کوئری ها تمام شده باشد، و اوراکل باید تا بدست آوردن تمام نتیجه مجموعه قبل از شروع مرتب سازی صبر کند.
چندین جایگزینی برای عملگر Union SQL در اوراکل وجود دارد:
  • استفاده از UNION ALL : ممکن است سریعتر باشد زمانی که در خروجی رکورد تکراری وجود نداشته باشد
  • اجرا کردن هر کوئری بصورت جداگانه و ترکیب کردن و مرتب سازی درون برنامه خودتان.
  • بعضی اوقات مرتب سازی بیرونی ممکن است باعث افزایش سرعت شود.
  • استفاده ازjoin جداول بصورت دستی، کند و ناکارامد می باشد.
  • در نسخه Oracle 11.2 بهینه ساز SQL بهبود یافته و برای UNION ALL از Join Factorization transformation مخفف -JFT- استفاده می کند.
  • با استفاده از نمایش کوئری ها در in-line کارائی بهبود بخشیده می شود.
به مثال زیر توجه کنید:

Q1:
select e1.empno, e2.deptno, e2.dname
from emp e1, dept e2
where e1.deptno = e2.deptno
Union All
select e1.empno, e2.deptno, e2.dname
from emp e1, dept e2
where e1.deptno = e2.deptno
حال اگر emp خیلی بزرگ باشد از یک اسکن بزرگ جلوگیری می شود و باعث بهبود عملکرد می گردد.
Q2:in-line
select e1.empno, vw_join.deptno, vw_join.dname
from emp e1, (
select e1.empno, e2.deptno, e2.dname
from emp e1, dept e2
where e1.deptno = e2.deptno
Union All
select e1.empno, e2.deptno, e2.dname
from emp e1, dept e2
where e1.deptno = e2.deptno
) vw_join
where e1.empno = vw_join.empno
استفاده از FULL OUTER JOIN with the NVL function به جای UNION، به نظر می رسد که دارای عملکرد سریعتری نسبت به UNION می باشد.
Q:
select
empno,
ename,
nvl(dept.deptno,emp.deptno) deptno, dname
from
test.emp
full outer join test.dept
on (emp.deptno = dept.deptno) order by 1,2,3,4
نکته:
وقتی شما UNION یا UNION ALL را جایگزین می کنید:
  • اولا باید با ” Execution Plan” آنرا در اوراکل مقایسه کنید.
  • دوما باید با استفاده از SQL*PLUS در اوراکل و فعال کردن set timing on زمان واقعی اجرا را نیز با هم مقایسه کنید.
امیدوار هستم به دوستان کمک کرده باشد.
5/5 - (1 امتیاز)

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

نشانی ایمیل شما منتشر نخواهد شد.

این قسمت نباید خالی باشد
این قسمت نباید خالی باشد
لطفاً یک نشانی ایمیل معتبر بنویسید.

فهرست
Oracle APEX Capabilities (OAC)