C. Thực hiện tối u phần mềm Quản lý hoá đơn nớc
1. Tối u bằng sử dụng Index
Khi hệ quản lý hoá đơn đã xây dựng xong và đợc đa vào sử dụng thì quá trình tính hoá đơn của hệ vẫn chậm. Để có thể tăng tốc độ thực hiện của chơng trình, các câu lệnh thực hiện trong quá trình tính hoá đơn đã đợc phân tích và kết quả cho thấy trạng thái mỗi hoá đơn đợc tính xong sẽ đợc cập nhật vào bảng hoá đơn (Bills) theo mã khách hàng (cust_id), tuy nhiên bảng Bills lại thiếu Index trên cột này vì vậy dẫn đến việc truy nhập bảng phải dùng phơng thức duyệt toàn bộ (xem cây phân tích lệnh liệt kê ở dới).
Để kiểm tra xem một cột đã đợc INDEX hay cha bằng cách xem View của hệ thống chứa thông tin về các cột đã Index có chứa cột đó hay không nh câu lệnh sau:
SELECT index_name,column_name FROM user_ind_columns WHERE table_name='BILLS';
Kết quả thu đợc nh sau:
INDEX_NAME COLUMN_NAME
--- ---
BILL_CRE_SCO_FK_I CR_SCORE_STT
BILL_EMP_FK_I EMP_ID
Theo kết quả trên thì Index cột cust_id của bảng Bills cha tồn tại vì vậy cần tạo Index cho cột CUST_ID của bảng BILLS nh sau:
CREATE INDEX bill_cust_id ON bills(cust_id);
Sau khi tạo các Index thì phơng thức truy nhập bảng BILLS chuyển từ duyệt toàn bộ (FULL) trở thành duyệt qua Index có giới hạn (RANGE SCAN trong cây
phân tích lệnh), thời gian thực hiện của các câu lệnh tơng ứng đợc lệt kê trong bảng so sánh:
Câu lệnh tính hoá đơn dựa trên bảng hoá đơn cơ sở (Based_Bill): begin :X0 := SP_WBL_CALCULATE_BASED_BILL(:CUST_ID_, :SUB_CUST_ID_,
:BRANCH_CODE_, :PERIOD_, :YEAR_, :NAME_, :CUSTOMER_NO_, :CONTRACT_NO_, :ACRINYM_, :BC_NAME_, :CURRENCY_ID_, :PERCENTAGE_, :ADDRESS_, :SIGN_, :BILL_STATUS_, :OLD_STT_, :OLD_PERIOD_, :OLD_YEAR_, :BILL_NO_);
end;
Bảng so sánh thời gian thực hiện procedure trớc và sau khi tạo Index
Index Call count cpu elapsed disk query current rows
Không 2 0.37 24.85 1308 1340 4 1
Có 2 0.28 0.28 0 37 2 1
Câu lệnh tìm lợng nớc điều chỉnh, lợng nớc tiêu thụ và mã trạng thái từ bảng hoá đơn (Bill):
SELECT NVL(WATER_ADJUST,0),NVL(LNTT,0),STATUS_CODE FROM BILLS WHERE CUST_ID = :b1 AND STT = :b2;
Bảng so sánh thời gian thực hiện câu lệnh trớc và sau khi tạo Index
Index Call count cpu elapsed disk query current rows
Không 3 0.10 24.03 1308 1310 2 2
Có 3 0.01 0.01 0 6 0 2
Cây phân tích lệnh khi cha có Index
Rows Execution Plan
--- ---
0 SELECT STATEMENT GOAL: CHOOSE
9827 TABLE ACCESS (FULL) OF 'BILLS' Cây phân tích lệnh khi đã có Index
Rows Execution Plan
--- --- 0 SELECT STATEMENT GOAL: CHOOSE 0 TABLE ACCESS (BY ROWID) OF 'BILLS'
0 INDEX (RANGE SCAN) OF 'BILL_CUST_ID' (NON-UNIQUE)
❏ Câu lệnh chuyển mã trạng thái cho các hoá đơn đã đợc tính: UPDATE BILLS SET PAID_STATUS=4
WHERE CUST_ID = :b1 AND STT IN
(SELECT STT FROM BASED_BILLS WHERE CUST_ID = :b1
AND NVL(SUB_CUST_ID,0) = :b3 AND STT != :b4 AND PERIOD = :b5 AND BILLING_YEAR = :b6 );
Bảng so sánh thời gian thực hiện câu lệnh trớc và sau khi tạo Index
Index Call count cpu elapsed disk query current rows
Không 2 0.05 29.00 1308 1316 5 3
Có 2 0.04 0.32 0 41 4 4
Cây phân tích lệnh khi cha có Index Rows Execution Plan
--- --- 0 UPDATE STATEMENT GOAL: CHOOSE 3 MERGE JOIN
4 SORT (JOIN)
9828 TABLE ACCESS (FULL) OF 'BILLS' 3 SORT (JOIN)
3 VIEW
3 SORT (UNIQUE)
4 TABLE ACCESS (BY ROWID) OF 'BASED_BILLS'
5 INDEX (RANGE SCAN) OF 'B_B_CUST_FK_I' (NON-UNIQUE) Cây phân tích lệnh khi đã có Index
Rows Execution Plan
--- --- 0 UPDATE STATEMENT GOAL: CHOOSE 0 NESTED LOOPS
0 VIEW
0 SORT (UNIQUE)
0 TABLE ACCESS (BY ROWID) OF 'BASED_BILLS'
0 INDEX (RANGE SCAN) OF 'B_B_CUST_FK_I' (NON-UNIQUE) 0 TABLE ACCESS (BY ROWID) OF 'BILLS'
0 INDEX (RANGE SCAN) OF 'BILL_CUST_ID' (NON-UNIQUE)
Câu lệnh xác lập giá trị tiền thu điều chỉnh và phụ thu điều chỉnh: UPDATE BILLS SET MONEY_ADJUST=:b1,SURCHARGE_ADJUST=:b2
WHERE CUST_ID = :b3 AND STT = :b4;
Bảng so sánh thời gian thực hiện câu lệnh trớc và sau khi tạo Index
Index Call count cpu elapsed disk query current rows
Không 2 0.02 28.28 1308 1312 3 1
Có 2 0.03 0.03 0 8 1 1
Cây phân tích lệnh khi cha có Index Rows Execution Plan
--- --- 0 UPDATE STATEMENT GOAL: CHOOSE 0 TABLE ACCESS (FULL) OF 'BILLS' Cây phân tích lệnh khi đã có Index Rows Execution Plan
--- --- 0 UPDATE STATEMENT GOAL: CHOOSE 0 TABLE ACCESS (BY ROWID) OF 'BILLS'
0 INDEX (RANGE SCAN) OF 'BILL_CUST_ID' (NON-UNIQUE)
Chú thích: Sau khi thử nghiệm tính 3858 hoá đơn bắt đầu từ 03:39:25 đến 04:47:48 thì xong. Tốc độ tính trung bình là 58 hoá đơn/ phút. Khi cha tạo Index thì với điều kiện nh vậy thời gian để tính là 173 phút (gấp 2.5 lần).