NỘI DUNG CỦA BUỔI HỌCPhâ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
Trang 1NỘ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
Trang 2select 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ó)
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 đó
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
Trang 3Area_code Local_fare Fare_rank
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,
Trang 4sum(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
Trang 5VI/ 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