N I DUNG C A BU I H C
Phân tích các hàm c b n trong Oracle và nh ng ví d đ n gi n gi i thích, gi i thi uơ ơ
v hàm trong Oracle
- Các hàm t p h p t đ ng: Rollup, cube
- Hàm x p h ng:ế rank, dense_rank, row_number
- Hàm Lag, lead
- Hàm First, last
- V n hành Oracle th c hi n b ng cách th 1: Vi t câu truy v n SQL ch t l ng ế ượ
cao
- V n hành Oracle th c hi n b ng cách th 2: S d ng Index thi t l p ch ng trình ế ươ
có hi u qu cao
I/ Phân tích các hàm t p h p t đ ng: Rollup và cube
S d ng ví d d i đây đ tính t ng các nguyên li u b ng phát bi u SQL thông ướ
th ng hi n th cho m i vùng(Area) ngay l p t c: ườ
select area_code,
sum(local_fare) local_fare
from t
group by area_code
union all
select ‘TOTAL' area_code,
sum(local_fare) local_fare
from t;
1/ Cũng v i k t qu đó nh ng s d ng v i câu l nh rollup: ế ư
select nvl(area_Code, ' total ' ) area_code,
sum(local_fare) local_fare
from t
group by rollup(nvl(area_Code, ' total '));
S d ng hàm Rollup, phát bi u Sql đ n gi n h n, có h th ng h n, tài nguyên tiêu ơ ơ ơ
th là r t th p so v i s d ng câu truy v n thông th ng. ườ
2/ S d ng ví d tính t ng v t li u v i hàm cube:
select area_code,
bill_month,
sum(local_fare) local_fare
from t
group by cube(area_code,bill_month)
order by area_code,
bill_month nulls last;
S d ng hàm s grouping phân bi t các tr ng t p h p. ườ n u nh t ng hi n t iế ư
là căn c o c t đó đ tính toán thì grouping s tr v 1 ng c l i là 0 ượ
select decode(grouping(area_code),1,'all area', to_char(area_code)) area_code,
decode(grouping(bil _month),1,'all month', bill_month) bill_month,
sum(local_fare) local_fare
from t
group by cube(area_code,bill_month)
order by area_code,bill_month nulls last;
II/ Phân tích hàm: Rank, dense_rank,row_Number function
1/ Hàm Rank
select area_code,
sum(local_fare) local_fare,
rank() over (order by sum(local_fare) desc) fare_rank
from t
group by area_code;
Hàm s x p h ng cho c t: ế local_fare giá tr x p h ng đ c đ a vào c t ế ượ ư
fare_rank
Giá tr l n nh t s có h ng bé nh t, d li u trùng thì đ ng h ng, h ng tí p theo là v ế
trí c a nó trong b ng x p h ng(Không l y v trí k ti p c a h ng trùng tr c nó). ế ế ế ướ
Area_code Local_fare Fare_rank
A1 100 1
A2 100 1
A3 101 3
2/ Hàm dense_rank
select area_code,
sum(local_fare) local_fare,
dense_rank() over (order by sum(local_fare) desc ) fare_rank
from t
group by area_code;
Hàm s x p h ng cho c t: ế local_fare giá tr x p h ng đ c đ a vào c t ế ượ ư fare_rank
Giá tr l n nh t s có h ng bé nh t, d li u trùng thì đ ng h ng, h ng tí p theo là ế
h ng k ti p c a h ng trùng tr c đó ế ế ướ
Area_code Local_fare Fare_rank
A1 100 1
A2 100 1
A3 101 2
3/ Hàm row_number
select area_code,
sum(local_fare) local_fare,
row_number() over (order by sum(local_fare) desc ) fare_rank
from t
group by area_code;
Hàm s x p h ng cho c t: ế local_fare giá tr x p h ng đ c đ a vào c t ế ượ ư fare_rank
Giá tr l n nh t s có h ng bé nh t, d li u trùng không đ ng h ng, h ng = ch s c a
hàng d li u
Area_code Local_fare Fare_rank
A1 100 1
A2 100 2
A3 101 3
II/ Phân tích hàm: lag, lead
Hàm Lag và Lead phán đoán n tháng tr c, sau nó hi n th trong câu truy v n.ướ
select area_code,
bill_month,
local_fare cur_local_fare,
lag(local_fare,2,0) over (partition by area_code order by bill_month)
pre_local_fare,
lag(local_fare,1,0) over (partition by area_code order by bill_month )
last_local_fare,
lead(local_fare,1,0) over (partition by area_code order by bill_month )
next_local_fare,
lead(local_fare,2,0) over (partition by area_code order by bill_month )
post_local_fare
from ( select area_code,
bill_month,
sum(local_fare) local_fare
from t
group by area_code,bill_month );
lag(local_fare,2,0): Tr c đó 2 thángướ
lag(local_fare,1,0): Tr c đó 1 thángướ
lead(local_fare,1,0): Sau đó 1 tháng
lead(local_fare,2,0): Sau đó 2 tháng
III/ Phân tích hàm s : Sum, Avg, Min, Max
select area_code,bill_month, local_fare,
sum(local_fare) over ( partition by area_code
order by to_number(bill_month)
range between 1 preceding and 1 following ) "3month_sum",
avg(local_fare) over ( partition by area_code
order by to_number(bill_month)
range between 1 preceding and 1 following ) "3month_avg",
max(local_fare) over ( partition by area_code
order by to_number(bill_month)
range between 1 preceding and 1 following ) "3month_max",
min(local_fare) over ( partition by area_code
order by to_number(bill_month)
range between 1 preceding and 1 following ) "3month_min"
from ( select area_code,
bill_month,
sum(local_fare) local_fare
from t
group by area_code, bill_month );
Ví d phía trên, tìm ra giá tr l n nh t, nh nh t, trung bình c a 3 tháng tính t tháng
hi n t i.
IV/ Phân tích hàm first, last
L y ra giá tr đ u và giá tr cu i
select bill_month,
area_code,
sum(local_fare) local_fare,
first_value(area_code) over (order by sum(local_fare) desc rows unbounded
preceding) firstval,
first_value(area_code) over (order by sum(local_fare) asc rows unbounded
preceding) lastval
from t
group by bill_month,
area_code
order by bill_month;
V/ V n hành Oracle th c hi n b ng cách th 1: Vi t câu truy v n SQL ch t ế
l ng caoượ
- S hi u qu l n c a câu truy v n SQL d a vào trình t vi t câu SQL. Oracle ế
s phân tích câu truy v n theo m t quy t c tên.
- M nh đ FROM s đ c hi u theo v trí t ph i qua trái ượ
- V trí k t n i trong m nh đ WHERE: Oracle ch n ra v trí t d i lên trên ế ướ
phân tích m nh đ WHERE. Đi u ki n đ l c ra d li u ph i đ c vi t cu i m nh ế ượ ế
đ WHERE
- Tránh s d ng trong m nh đ SELECT d u ‘*’: Oracle s b t đ u vào bên
trong tìm tên t t c các hàng trong su t quá trình tìm ki m, phân tích d li u. Quá trình ế
này s làm t n r t nhi u th i gian.
- C g ng đánh giá h n ch các giá tr NULL trong m nh đ WHERE, N u ế ế
không Index s ng ng s d ng, và không th Scan. Khi đánh giá m t tr ng d li u là ư ườ
0 b ng câu truy v n: select id from t where num is null . Khi đó ta đ m c đ nh
select id from t where num =0
- X lý câu truy v n SQL: Oracle luôn phân tích phát bi u SQL chuy n toàn b
thành ký t hoa đ a vào x ư
- C g ng tránh dùng các toán t ‘/’ trong m nh đ WHERE, vì nó là lý do mà
Index không s d ng đ c và Scan toàn b table làm chu ng trình ch y ch m. ượ ơ
Thay vì select id from t where num/2=100 chuy n thành
select id from t where num=100*2.
- Không ghi các phép toán s h c, công th c bên trái c a toán t =’ n u không ế
h th ng không th s d ng đ c Index. ượ
VI/ V n hành Oracle th c hi n b ng cách th 2: S d ng Index thi t l p ế
ch ng trình có hi u qu caoươ
- Thay th IN v i EXISTS, thay th NOT IN v i NOT EXISTSế ế
- Phát bi u d i đây có hi u qu cao ướ
SELECT * FROM EMP (base table)
WHERE EMPNO > 0
AND EXISTS (SELECT ‘X’ FROM DEPT WHERE
DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)
- Thay th OR v i UNION(S d ng Index đ c s p x p)ế ượ ế
SELECT * FROM EMP (base table) WHERE EMPNO > 0 AND DEPTNO
IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)
- Tránh s d ng các phép toán làm t n tài nguyên và th i gian: DISTINCT , ORDER
BY
- Tránh thay đ i ki u s p x p c a Index: ế
oGi s EMPNO là ki u s p x p Index là ki u Number ế
oKhi ta s d ng câu truy v n: SELECT … FROM EMP WHERE EMPNO =
‘123'
oT i th i đi m runtime s tr v cú pháp:
SELECT … FROM EMP WHERE to_number(EMPNO) = 123
-
- Không ph i t t c các Index đ u mang l i k t qu nh mong mu n. SQL đánh giá ế ư
thông tin theo cách đ n d li u trong m t hình th c, khi s lu ng quy mô c a dế
li u đ c l p l i trong hình th c đó. SQL không đ m nh đ l y thông tin. N u ượ ế
có các ph n: Sex, male, female g n tách bi t m t n a, vi c xây d ng Index l y
thông tin đó hi u qu là không th làm vi c v i Sex.
- Tránh s d ng IS NULL trên Index, IS NOT NULL
- Example:
SELECT ¡ FROM A WHERE code IS NOT NULL;
Hi u qu cao: SELECT ¡ FROM A WHERE CODE > =0;
- Oracle s d ng Index và lý do hi n nhiên d n đ n s kém hi u qu c a s d ng ế
sai nó . Chúng ta c n s d ng t t c các k năng h p lý tránh xa Index, không lên
s d ng.
- Ki m tra: Ta có các ph n: a, b, c, d, trong a, b cái đ t tr thành Index trên c_a(a,b,c)
. Cài đ t Index inx_a, b_b(b). Trong tr ng h p c b n, where a = ? and b=? and c ườ ơ
= ? chúng ta s s d ng Index inx_a where b =? S s d ng Index inx_b , tuy nhiên
where a =? and b =? and c =? Cái index broup by b đ s d ng hay không?
- Oracle s m s d ng inx_b, xuyên su t qúa trình phân tích và x s d ng
Index s phá hu và m t th i gian r t nhi u.