Tối u bằng thêm chỉ thị thực hiện và thay đổi câu lệnh SQL

Một phần của tài liệu Phân tích và tối ưu hóa câu lệnh SQL (Trang 76 - 96)

C. Thực hiện tối u phần mềm Quản lý hoá đơn nớc

2.Tối u bằng thêm chỉ thị thực hiện và thay đổi câu lệnh SQL

Câu lệnh chứa sub query:

 Ví dụ để lấy ra các thông tin về khách hàng thuộc chi nhánh Sài Gòn

(BC_CODE = 'A5'), thuộc về chi nhánh Sài Gòn (BRANCH_ID = 3), đang lắp đạt đồng hồ và đang đợc cung cấp nớc (ACTIVE = 1, STATUS=1) có thể dùng câu lệnh sau:

SELECT ID, NAME, CUSTOMER_NO, CONTRACT_NO, CURRENCY_ID, SORT_NAME, BRANCH_CODE, ADDRESS

FROM SNAP$_CUSTOMERS$SG

WHERE ID IN (SELECT CUST_ID FROM SNAP$_ABC$SG WHERE STATUS=1 AND BC_CODE='A5'

AND BRANCH_ID=3 AND ACTIVE=1);

Với mỗi hàng thuộc bảng CUTOMERS đều phải duyệt lần lợt ứng với bảng SNAP$_ABC$SG. Tổng số thời gian thực hiện là:

call count cpu elapsed disk query current rows

total 269 5.28 9.46 1444 52546 3 4002

Cây phân tích lệnh: Rows Execution Plan

--- --- 0 SELECT STATEMENT GOAL: CHOOSE 13965 FILTER

13965 TABLE ACCESS (FULL) OF 'SNAP$_CUSTOMERS$SG' 4002 FILTER

9111 TABLE ACCESS (BY ROWID) OF 'SNAP$_ABC$SG'

19073 INDEX (RANGE SCAN) OF 'ASS_BCY_CUST_FK_I_SG' (NON-UNIQUE)

 Câu lệnh tơng đơng sử dụng phép kết nối:

SELECT ID, NAME, CUSTOMER_NO, CONTRACT_NO, CURRENCY_ID, SORT_NAME, BRANCH_CODE, ADDRESS

FROM SNAP$_CUSTOMERS$SG, SNAP$_ABC$SG WHERE STATUS=1 AND ID=CUST_ID and BC_CODE='A5' AND BRANCH_ID=3 AND ACTIVE=1;

Thời gian thực hiện:

call count cpu elapsed disk query current rows

total 269 1.99 2.44 309 20632 2 4002

Cây phân tích lệnh: Rows Execution Plan

0 SELECT STATEMENT GOAL: CHOOSE 4002 NESTED LOOPS

9113 TABLE ACCESS (FULL) OF 'SNAP$_ABC$SG'

4003 TABLE ACCESS (BY ROWID) OF 'SNAP$_CUSTOMERS$SG' 8006 INDEX (RANGE SCAN) OF 'CUST_PK_I_SG' (NON-UNIQUE)

Kết luận

Đánh giá chung về đề tài và các kết quả

Hệ quản trị CSDL là một hệ rất phức tạp gồm nhiều modul đợc thiết kế hớng chức năng trong đó modul tối u chiếm vị trí quan trọng bậc nhất trong quá trình phát triển các phần mềm ứng dụng trên đó.

Trong điều kiện lý tởng, modul tối u sẽ đảm bảo các câu lệnh SQL tơng đơng về mặt ngữ nghĩa (cùng semantics) sẽ có thời gian thực hiện là nh nhau và nhỏ nhất.

Trên thực tế, ngay cả đối với các hệ Quản trị CSDL thông minh hiếm khi đạt đ- ợc điều này. Vì vậy các nhà phát triển hệ Quản trị CSDL để lại không gian cho ngời viết ứng dụng cũng nh quản trị CSDL tuỳ theo điều kiện, có thể tác động đến modul tối u các câu lệnh SQL.

Tối u các câu lệnh SQL trong luận văn này thực chất là tác động đến modul tối u và modul thực hiện lệnh SQL. (adsbygoogle = window.adsbygoogle || []).push({});

Để tác động đến modul tối u hữu hiệu mang lại kết quả mong muốn, luận văn phân tích và giải quyết đợc vấn đề sau:

• Khi nào cần tạo index, tạo kiểu index gì, index trên cột hoặc tổ hợp cột nào. • Thu thập thông tin về CSDL, để modul tối u có thêm thông tin phục vụ cho quá trình đánh giá các câu lệnh SQL.

• Điều khiển cách thực hiện lệnh SQL của modul tối u.

• Cách thay đổi các tham số của hệ Quản trị CSDL nhằm giúp cho modul tối u và các thành phần khác sử dụng có hiệu quả tài nguyên của hệ thống nh bộ nhớ RAM, đĩa cứng, CPU.

• Đa ra khả năng và hạn chế của hệ Quản trị CSDL trong việc tối u và thực hiện các câu lệnh SQL, từ đó đề ra nguyên tắc mà ngời phát triển cần tuân thủ khi viết câu lệnh SQL.

Tất cả các vấn đề trên đợc đề cập trong mối liên quan tơng hỗ với nhau và với HĐH, loại ứng dụng và môi trờng ứng dụng cụ thể.

Tuy tất cả chỉ thực hiện với hệ Quản trị CSDL cụ thể Oracle, nhng dễ dàng ứng dụng cho các hệ Quản trị CSDL khác.

Luận văn sử dụng các cách giải quyết nêu trên cho một bài toán cụ thể là Hệ tính hoá đơn và quản lý khách hàng của WSC. Đây là một hệ thống mới đợc phát triển và bớc đầu đa vào sử dụng. Bài toán đợc thiết kế công phu có nhiều chức năng với hàng trăm thực thể, hoạt động trong môi trờng phân tán. Khối lợng dữ liệu có thể nói là khá lớn, đảm bảo nhu cầu đặt ra về tốc độ xử lý là vấn đề sống còn của hệ thống.

Trong phần ví dụ thực nghiệm, luận văn thực hiện việc:

• Tìm ra các câu lệnh SQL chạy chậm, tốn nhiều tài nguyên HĐH • Phân tích các câu lệnh đó

• Đề ra biện pháp giải quyết (cách tối u)

So sánh kết quả chạy thử trớc và sau khi sử dụng cách tối u của luận văn, có thể thấy ở nhiều nơi tốc độ nhanh lên 3- 4 lần. Đây là lợi ích thiết thực và có ý nghĩa.

Do khuôn khổ có hạn của luận văn cũng nh giới hạn về thời gian, không khỏi không có những thiếu sót và hạn chế. Phát triển và mở rộng đề tài là cần thiết, xin đơn cử một vài ý tởng liên quan đến việc xây dựng mô hình, thử và đánh giá toàn diện, đo tốc độ thực hiện của hệ phần mềm:

• Đánh giá ảnh hởng của môi trờng mạng máy tính đối với hệ CSDL hoạt

động phân tán trên nhiều nút mạng.

• Phân tích cách thực hiện, đánh giá, tối u cách lệnh truy nhập dữ liệu phi cấu trúc

• Phân tích ảnh hởng của các loại ứng dụng khác nhau (OLTP, OLAP, GIS,...) đối với hệ Quản trị CSDL và dữ liệu.

Tài liệu tham khảo

1. Nhập môn cơ sở dữ liệu quan hệ , Tác giả Lê Tiến Vơng, NXB KH và KT. 2. Phân tích và thiết kế tin học hệ thống Quản lý-Kinh doanh-Nghiệp vụ, NXB Giao thông vận tải.

3. Oracle Corp: Introduction to Oracle: SQL, SQL*Plus and PL/SQL, Couse Note - 1992

4. Oracle Server Turning Part No. A32537-1 Printed in the U.S.A June, 1996 5. Participant guide: Administer the Oracle Database Part No. A32535-1 Printed in the U.S.A February 1996.

6. Oracle 7 Server - Concepts Part No. A32534-1 Printed in the U.S.A February 1996.

Phụ lục

Phụ lục A

Các lệnh phân tích đối tợng và phân tích câu lệnh

Lệnh ANALYZE

Chức năng: Phân tích thông tin trạng thái về một một index, bảng, hoặc cluster và đa các thông tin này vào vào trong từ điển dữ liệu để sử dụng cho vệc tối u hoá.

Cú pháp:

ANALYZE { INDEX | TABLE | CLUSTER } [<tên lợc đồ>.] <tên đối tợng> { COMPUTE STATISTICS | ESTIMATE STATISTICS | DELETE STATISTICS | VALIDATE STRUCTURE }

Giải thích: (adsbygoogle = window.adsbygoogle || []).push({});

SCHEMA: Tên lợc đồ chứa đối tợng cần phân tích. Nếu bỏ qua đối số này thì

Oracle sẽ sử dụng lợc đồ của User hiện tại. Khi phân tích một bảng thì các Index trên bảng đã chỉ ra cũng tự động đợc phân tích. Với Cluster thì toàn bộ các bảng, các Index và Index của Cluster cũng đợc phân tích.

COMPUTE STATISTICS: Tính toán chính xác trạng thái các đối tợng và đặt chúng trong từ điển dữ liệu.

ESTIMATE STATISTICS: Ước lợng trạng thái các đối tợng đợc phân tích.

DELETE STATISTICS: Xoá thông tin trạng thái của đối tợng trong từ điển dữ liệu.

VALIDATE STRUCTURE: Kiểm tra và làm hợp lệ cấu trúc của các đối tợng đợc

phân tích.

Lệnh EXPLAIN PLAN

Chức năng: Xây dựng cây phân tích lệnh với lệnh đợc đa ra. Cú pháp:

EXPLAIN PLAN [SET STATEMENT ID = 'text'] [INTO [<tên lợc đồ>.]<tên bảng>] FOR <câu lệnh>

SET: Giá trị đặc biệt cho cột STATEMENT_ID trong cây phân tích lệnh. Giá trị ngầm định là null.

INTO: Tên bảng chứa kết quả của cây phân tích lệnh. Bảng này phải đợc tạo ra trớc khi sử dụng câu lệnh EXPLAIN PLAN.

Phụ lục B

Tối u câu lệnh trên view Trong phần mềm tra cứu văn bản pháp qui

Phần mềm Tra cứu văn bản pháp qui dùng để tra cứu văn bản của UBND các tỉnh và của Văn phòng chính phủ đã ban hành bằng WEB trên mạng diện rộng của Văn phòng chính phủ. Mỗi văn bản có một mã văn bản, một chủ đề, một mã địa phơng, có nội dung trích yếu và nội dung toàn văn. Một văn bản khi đợc phát hành (gọi là văn bản triển khai) thì có thể đợc dựa trên một số văn bản khác gọi là văn bản căn cứ. Trong CSDL ở mỗi địa phơng đều các View là hợp (UNION ALL) của các có bảng chứa văn bản không mật và văn bản mật đồng thời có ảnh của các văn bản trên trung ơng (các Snapshot).

Hiện tại CSDL của tỉnh Nghệ An (mã địa phơng là NAN) có 4110 văn bản và tra cứu nội dung của một văn bản với hệ chơng trình cha tối u thì thời gian đáp ứng là 41.23 giây (Server IBM). Sau khi tiến hành phân tích câu lệnh thì điểm bất hợp lý ở chỗ do View có chứa toán tử tập hợp UNION ALL và chỉ có các điều kiện AND trong mệnh đề WHERE trong khi Oracle chỉ tối u câu lệnh nh vậy với điều kiện OR (xem phần tối u câu lệnh trên View), do vậy phải chuyển câu lệnh truy xuất trên View bằng việc kết hợp câu lệnh vào View (truy xuất trực tiếp với bảng rồi hợp các kết quả). Câu lệnh sau khi tối u có thời gian đáp ứng là 2.36 giây (bằng 5.7%). Dới đây là nội dung câu lệnh tìm ra văn bản căn cứ văn bản triển khai với mã văn bản và mã địa phơng đang tra cứu, nội dung cây phân tích lệnh, thời gian thực hiện đợc tính toán bởi hệ thống.

V_VBTH o MA_VB o NGUOI_KY o SO o KY_HIEU o NGAY_PH o TOAN_VAN o TRICH_YEU o MA_CHU_DE o MA_LOAI_VB o MA_DP V_TKTH o MA_TU_KHOA o MA_VB o MA_DP V_CCTH o MA_VB o MA_CC o MA_DP_VB o MA_DP_CC VB (#) # * MA_VB # * MA_DP * SO * KY_HIEU * XEM * NGAY_PH o NGUOI_KY * TOAN_VAN o TRICH_YEU * MA_CHU_DE * MA_LOAI_VB TOAN_VAN (#) # * MA_DP # * MA_VB o EXT o NOI_DUNG TK (#) # * MA_TU_KHOA # * MA_VB # * MA_DP NKTW (#) # * NKTW_ID * THU_TU * NGUOI_KY LMTW (#) # * DATA_BASE * MA_DP * PATH_TV * OPER_SYS * VERSION DMTK (#) # * MA_TU_KHOA * TEN_TU_KHOA DMLVB (#) # * MA_LOAI_VB * TEN_LOAI_VB DMLCD (#) # * MA_LOAI_CD * TEN_LOAI_CD DMDP (#) # * MA_DP * TEN_DP * HIEU_LUC * NGAY_HL o TEN_TAT o DIA_CHI o DIEN_THOAI o FAX * DATA_BASE * PATH_TV o VERSION DMCD (#) # * MA_CHU_DE * TEN_CHU_DE * MA_LOAI_CD CCTW (#) # * MA_VB # * MA_CC # * MA_DP_VB # * MA_DP_CC CCTW_VB_VB_FK DMCD_DMLCD_F K TK_DMTK_FK TK_VB_FK VB_DMCD_FK VB_DMDP_FK VB_DMLVB_FK

Sơ đồ thực thể của phần mềm Tra cứu Văn bản pháp qui

Câu lệnh tìm văn bản căn cứ khi cha tối u là 21.03 giây, câu lệnh sau khi tối u có thời gian đáp ứng là 1.26 giây (bằng 4.8%). Câu lệnh tìm văn bản triển khai khi cha tối u là 18.99 giây, câu lệnh sau khi tối u có thời gian đáp ứng là 0.49 giây (bằng 2.5%).

❑ Câu lệnh chọn ra văn bản căn cứ khi cha tối u:

SELECT V_CCTHDP.MA_CC, V_CCTHDP.MA_DP_CC, V_VBCC.SO, V_VBCC.KY_HIEU, V_VBCC.NGAY_PH, V_VBCC.TRICH_YEU, V_CCTHDP.MA_DP_VB, V_CCTHDP.MA_VB

FROM V_CCTHDP V_CCTHDP, V_VBTHDP V_VBCC, V_S_DMDP V_S_DMDP1, V_S_DMLVB V_S_DMLVB1, V_S_DMCD V_S_DMCD1

WHERE V_VBCC.MA_VB = V_CCTHDP.MA_CC and V_VBCC.MA_DP = V_CCTHDP.MA_DP_CC and V_S_DMDP1.MA_DP = V_VBCC.MA_DP and V_S_DMLVB1.MA_LOAI_VB = V_VBCC.MA_LOAI_VB and V_S_DMCD1.MA_CHU_DE = V_VBCC.MA_CHU_DE

and (V_CCTHDP.MA_DP_VB = 'NAN') and (V_CCTHDP.MA_VB = 25);

Thời gian thực hiện

call count cpu elapsed disk query current rows

--- --- --- --- --- --- --- --- Parse 1 0.04 0.04 0 0 0 0 Execute 2 0.05 4.66 0 0 3 0 Fetch 1 0.66 16.33 356 429 2462 0 --- --- --- --- --- --- --- --- total 4 0.75 21.03 356 429 2465 0 Cây phân tích lệnh

Rows Execution Plan

--- --- 0 SELECT STATEMENT GOAL: CHOOSE 0 MERGE JOIN 0 SORT (JOIN) 0 MERGE JOIN 0 SORT (JOIN) 0 MERGE JOIN 4110 SORT (JOIN) 4110 MERGE JOIN 56 SORT (JOIN)

56 TABLE ACCESS (FULL) OF 'SNAP$_S_DMCD' 4110 SORT (JOIN) (adsbygoogle = window.adsbygoogle || []).push({});

4110 VIEW OF 'V_VBTHDP' 4110 SORT (UNIQUE) 4110 UNION-ALL

5 TABLE ACCESS (FULL) OF 'VBDP'

4105 TABLE ACCESS (FULL) OF 'SNAP$_S_VBKM' 0 TABLE ACCESS (FULL) OF 'SNAP$_S_VBM' 0 SORT (JOIN)

0 VIEW OF 'V_CCTHDP' 0 SORT (UNIQUE) 0 UNION-ALL

0 TABLE ACCESS (BY ROWID) OF 'CCDP'

1 INDEX (RANGE SCAN) OF 'IDX_CCDP_VB_DPVB' (NON-UNIQUE)

0 TABLE ACCESS (BY ROWID) OF 'SNAP$_S_CC' 1 INDEX (RANGE SCAN) OF 'IDX_S_CC_VB_DPVB' (NON-UNIQUE)

0 SORT (JOIN)

0 TABLE ACCESS (FULL) OF 'SNAP$_S_DMLVB' 0 SORT (JOIN)

0 TABLE ACCESS (FULL) OF 'SNAP$_S_DMDP'

❑ Câu lệnh tìm văn bản căn cứ sau khi đã tối u:

SELECT V_CCTHDP.MA_CC, V_CCTHDP.MA_DP_CC, VBDP.SO, VBDP.KY_HIEU, VBDP.NGAY_PH, VBDP.TRICH_YEU, V_CCTHDP.MA_DP_VB, V_CCTHDP.MA_VB

FROM V_CCTHDP V_CCTHDP, VBDP VBDP, V_S_DMDP V_S_DMDP1, V_S_DMLVB V_S_DMLVB1, V_S_DMCD V_S_DMCD1

WHERE (V_CCTHDP.MA_VB = 26) and (V_CCTHDP.MA_DP_VB = 'NAN')

and VBDP.MA_VB = V_CCTHDP.MA_CC and VBDP.MA_DP = V_CCTHDP.MA_DP_CC

and VBDP.MA_DP = V_S_DMDP1.MA_DP and VBDP.MA_LOAI_VB = V_S_DMLVB1.MA_LOAI_VB and VBDP.MA_CHU_DE = V_S_DMCD1.MA_CHU_DE

UNION

SELECT V_CCTHDP.MA_CC, V_CCTHDP.MA_DP_CC, VBTW.SO, VBTW.KY_HIEU, VBTW.NGAY_PH, VBTW.TRICH_YEU, V_CCTHDP.MA_DP_VB, V_CCTHDP.MA_VB

FROM V_CCTHDP V_CCTHDP, SNAP$_S_VBKM VBTW, V_S_DMDP V_S_DMDP1, V_S_DMLVB V_S_DMLVB1, V_S_DMCD V_S_DMCD1

WHERE (V_CCTHDP.MA_VB = 26) and (V_CCTHDP.MA_DP_VB = 'NAN')

and VBTW.MA_VB = V_CCTHDP.MA_CC and VBTW.MA_DP = V_CCTHDP.MA_DP_CC

and VBTW.MA_DP = V_S_DMDP1.MA_DP and VBTW.MA_LOAI_VB = V_S_DMLVB1.MA_LOAI_VB and VBTW.MA_CHU_DE = V_S_DMCD1.MA_CHU_DE

--- --- --- --- --- --- --- --- Parse 1 0.12 0.16 2 0 2 0 Execute 2 0.00 0.00 0 0 0 0 Fetch 1 0.51 1.10 464 8506 447 0 --- --- --- --- --- --- --- --- total 4 0.63 1.26 466 8506 449 0 Cây phân tích lệnh

Rows Execution Plan

--- --- 0 SELECT STATEMENT GOAL: CHOOSE 0 SORT (UNIQUE) 0 UNION-ALL 0 MERGE JOIN 0 SORT (JOIN) 0 MERGE JOIN 0 SORT (JOIN) 0 MERGE JOIN 5 SORT (JOIN) 5 NESTED LOOPS

56 TABLE ACCESS (FULL) OF 'SNAP$_S_DMCD' 5 TABLE ACCESS (BY ROWID) OF 'VBDP' 61 INDEX (RANGE SCAN) OF 'VBDP_MA_CDE_I' (NON-UNIQUE)

0 SORT (JOIN)

0 VIEW OF 'V_CCTHDP' 0 SORT (UNIQUE) 0 UNION-ALL

0 TABLE ACCESS (BY ROWID) OF 'CCDP'

1 INDEX (RANGE SCAN) OF 'IDX_CCDP_VB_DPVB' (NON-UNIQUE) (adsbygoogle = window.adsbygoogle || []).push({});

0 TABLE ACCESS (BY ROWID) OF 'SNAP$_S_CC' 1 INDEX (RANGE SCAN) OF 'IDX_S_CC_VB_DPVB' (NON-UNIQUE)

0 SORT (JOIN)

0 TABLE ACCESS (FULL) OF 'SNAP$_S_DMLVB' 0 SORT (JOIN)

0 TABLE ACCESS (FULL) OF 'SNAP$_S_DMDP' 0 MERGE JOIN

0 MERGE JOIN 0 SORT (JOIN) 0 MERGE JOIN 4105 SORT (JOIN) 4105 NESTED LOOPS

56 TABLE ACCESS (FULL) OF 'SNAP$_S_DMCD' 4105 TABLE ACCESS (BY ROWID) OF 'SNAP$_S_VBKM' 4161 INDEX (RANGE SCAN) OF 'S_VBKM_MA_CDE_I' (NON-UNIQUE)

0 SORT (JOIN)

0 VIEW OF 'V_CCTHDP' 0 SORT (UNIQUE) 0 UNION-ALL

0 TABLE ACCESS (BY ROWID) OF 'CCDP'

1 INDEX (RANGE SCAN) OF 'IDX_CCDP_VB_DPVB' (NON-UNIQUE)

0 TABLE ACCESS (BY ROWID) OF 'SNAP$_S_CC' 1 INDEX (RANGE SCAN) OF 'IDX_S_CC_VB_DPVB' (NON-UNIQUE)

0 SORT (JOIN)

0 TABLE ACCESS (FULL) OF 'SNAP$_S_DMLVB' 0 SORT (JOIN)

0 TABLE ACCESS (FULL) OF 'SNAP$_S_DMDP'

❑ Câu lệnh tìm ra văn bản triển khai khi cha tối u:

SELECT V_CCTKDP.MA_CC, V_CCTKDP.MA_DP_CC, V_CCTKDP.MA_DP_VB, V_CCTKDP.MA_VB, V_VBTK.SO, V_VBTK.KY_HIEU, V_VBTK.NGAY_PH, V_VBTK.TRICH_YEU

FROM V_CCTHDP V_CCTKDP, V_VBTHDP V_VBTK, V_S_DMDP V_S_DMDP2, V_S_DMLVB V_S_DMLVB2, V_S_DMCD V_S_DMCD2

WHERE V_VBTK.MA_VB = V_CCTKDP.MA_VB and V_VBTK.MA_DP = V_CCTKDP.MA_DP_VB and V_S_DMDP2.MA_DP = V_VBTK.MA_DP and V_S_DMLVB2.MA_LOAI_VB = V_VBTK.MA_LOAI_VB and V_S_DMCD2.MA_CHU_DE = V_VBTK.MA_CHU_DE

and (V_CCTKDP.MA_CC = 25) and (V_CCTKDP.MA_DP_CC = 'NAN');

Thời gian thực hiện

call count cpu elapsed disk query current rows

Execute 2 0.01 3.99 0 0 3 0

Một phần của tài liệu Phân tích và tối ưu hóa câu lệnh SQL (Trang 76 - 96)