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

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

Đang tải... (xem toàn văn)

Thông tin tài liệu

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. . 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,. ‘*’: 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á. 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

Ngày đăng: 02/08/2014, 02:21

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan