Tải bản đầy đủ (.doc) (5 trang)

Phân tích các hàm cơ bản trong Oracle pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (119.12 KB, 5 trang )

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ứ và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ử lý
- 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:
o Giả sử EMPNO là kiểu sắp xếp Index là kiểu Number
o Khi ta sử dụng câu truy vấn: SELECT … FROM EMP WHERE EMPNO =
‘123'
o Tạ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ử lý sử dụng Index
sẽ phá huỷ và mất thời gian rất nhiều.

×