Tải bản đầy đủ (.pdf) (15 trang)

Các Kỹ Thuật Tối Ưu Trong Viết Lệnh Truy Vấn Sql.pdf

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 (1.61 MB, 15 trang )

<span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

M MỤỤỤC LC LC LỤỤỤCCCCC

TASK 5: CÁC K THU T TỸ Ậ ỐI ƯU TRONG VIẾT LỆNH TRUY VẤN SQL ... 2 1. S d ng tên c t thay vì * trong SELECT ... 2 ử ụ ộ 2. Tránh đưa mệnh đề HAVING trong l nh SELECT ... 2 ệ 3. Lo i b các mạ ỏ ệnh đề DISTINCT không c n thi t ... 3 ầ ế 4. Un-nest các truy v n n i b (Sub-query) ... 3 ẫ ộ ộ 5. Cân nh c s d ng mắ ử ụ ệnh đề IN khi truy v n m t cấ ộ ột đã được đánh INDEX ... 4 6. S d ng EXISTS thay cho DISTINCT khi k t n i các b ng có m t ho c nhi u liên k t ... 5 ử ụ ế ố ả ộ ặ ề ế 7. S d ng UNION ALL thay cho UNION ... 5 ử ụ 8. Tránh s d ng OR trong các mử ụ ệnh đề thỏa mãn nhiều điều ki n ... 6 ệ 9. Tránh đặt hàm số bên phải của toán tử so sánh ... 7 3.2. Mã hóa khơng gian b ng TDE<i>ả</i> ... 1 4. Các thu t toán mã hóa sau h ậ ỗ trợ trong SQL Server ... 2 5. Các bước b t Mã hóa dậ ữ liệu minh b ch (TDE)... 2ạ

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

TASK 5: CÁC K THU<b>ỸẬ</b>T T<b>ỐI ƯU TRONG VIẾ</b>T L<b>ỆNH TRUY V N SQL Ấ</b>

Tối ưu hóa truy vấn là một kĩ năng quan trọng đối với các Data Analyst, nguời khai thác dữ liệu t CSDL vừ ớ ần su t cao. Vii t ấ ệc điều ch nh truy v n có liên quan t i nh ng ki n ỉ ấ ớ ữ ế thức về các kĩ thuật như công cụ ối ưu theo chi phí và theo kinh nghiệ t m, cộng với những cơng cụ giúp phân tích kế hoạch thực thi truy vấn (execution plan) do CSDL cung cấp.

1. S d ng tên c t thay vì * trong SELECT <b> ử ụộ</b>

Nếu b n ch ạ ỉ đang chọn một số ít cột từ ả b ng, không c n s d ng l nh SELECT *. Dù ầ ử ụ ệ cách viết này dễ, nhưng lại gây t n nhi u thố ề ời gian hơn để cơ sở ữ liệ d u có th hồn thành ể truy v n. B ng cách ch ấ ằ ỉ chọn nh ng cữ ột cần thiết, bạn đang giảm b t kích c c a b ng kớ ỡ ủ ả ết qu , giả ảm lưu lượng m ng, và làm tạ ăng hiệu năng của truy v n. ấ

Ví dụ: Truy v n g<i>ấốc: </i>

SELECT * FROM SH.Sales; Truy v<i>ấn đã được cả</i>i thi n:<i>ệ </i>

SELECT s.prod_id FROM SH.sales s;

2.<b> Tránh đưa mệnh đề</b> HAVING trong l nh SELECT <b>ệ</b>

Mệnh đề HAVING có tác d ng lụ ọc sau khi các hàng đã được chọn và được sử ụng như d m t filter. Mộ ệnh đề này khơng có nhi u tác d ng về ụ ới lệnh SELECT. Cách hoạt động c a nó ủ là quét qua bảng k t qu ế ả cuối cùng để phân tích và b nhỏ ững hàng không đáp ứng điều ki n ệ

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

Truy v<i>ấn đã được cả</i>i thi n:<i>ệ </i>

3. Lo<b>ại bỏ</b> các m<b>ệnh đề</b> DISTINCT không c n thi t <b>ầế</b>

Khi xem xét ví dụ dưới đây, từ khóa DISTINCT trong truy vấn gốc là khơng cần thiết vì tên bảng đã chứa p.ID là khóa chính c a b ng ủ ả – đây là một phần của kết quả. Việc đưa m nh d DISTINCT s khi n CSDL thệ ề ẽ ế ực hiện thêm m t phép so ộ sánh để loại bỏ các dòng

WHERE c.cust_marital_status = 'single'; Truy v<i>ấn đã được cả</i>i thi n:<i>ệ </i>

SELECT * FROM SH.sales s JOIN SH.customers c

ON s.cust_id = c.cust_id

WHERE c.cust_marital_status='single';

4. Un-nest các truy v<b>ẫn nội bộ</b> (Sub-query)

Viết lại các sub-query s giúp truy v n ch y hi u qu và tẽ ấ ạ ệ ả ối ưu hơn. Nhìn chung, việc unnest các sub-query luôn được tiến hành v i sub-quớ ery tương tác với tối đa một bảng t ừ mệnh đề FROM, được s d ng trong các mử ụ ệnh đề ANY, ALL, và EXISTS. Một sub-query

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

không tương quan, hay một sub-query với nhiều hơn một bảng từ mệnh đề FROM, sẽ được

FROM SH.products p, sales s WHERE p.prod_id = s.prod_id AND s.cust_id = 100996 AND s.quantity_sold = 1;

5. Cân nh<b>ắc sử ụ</b> d ng m<b>ệnh đề</b> IN khi truy v n m<b>ấột cột đã được đánh INDEX</b>

Mệnh đề IN có thể được khai thác cho các lệnh truy v n s d ng bấ ử ụ ảng đã được đánh INDEX, và đồng thời, cơng c tụ ối ưu hóa có thể ắp x s ếp danh sách IN để khớp v i thứ ựớ t phân loại của chỉ ố s , d n tẫ ới lệnh truy v n hi u qu ấ ệ ả hơn. Do đó khi trong q trình thực hành và t h c SQL, c n chú ý r ng danh sách IN ch ự ọ ầ ằ ỉ được ch a các hà m, ho c các giá trứ ặ ị là hằng s ố trong việc thực hiện kh i truy v n, ví d ố ấ ụ như các tham chi u ngồi. ế

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

Từ khóa DISTINCT có tác d ng ch n tụ ọ ất cả ột trong bả c ng, phân tích và lọc ra các cột bị trùng lặp. Thay vào đó, nếu bạn s d ng sub-query vử ụ ới từ khóa EXISTS, bạn có thể tránh việc phả ả l i toàn b m t b ng. i tr ạ ộ ộ ả

<b>Ví dụ: </b>

Truy v n g<i>ấốc: </i>

SELECT DISTINCT c.country_id, c.country_name FROM SH.countries c,SH.customers e

WHERE e.country_id = c.country_id; Truy v<i>ấn đã được cả</i>i thi n:<i>ệ </i>

SELECT c.country_id, c.country_name FROM SH.countries c

WHERE EXISTS (SELECT 'X' FROM SH.customers e WHERE e.country_id = c.country_id);

7. S d ng UNION ALL thay cho UNION <b>ử ụ</b>

Mệnh đề UNION ALL nhanh hơn UNION bỏi vì mệnh đề UNION ALL khơng tính tới các điểm trùng lập và mệnh đề UNION lại tìm các điểm trùng lặp trong b ng khi ch n ả ọ hàng, dù có điểm trùng lặp hay khơng hãy ưu tiên sử dụng UNION ALL khi chúng ta biết chắc chắn m i dòng trong kỗ ết quả sẽ là duy nhất hoặc có thể ấp nh n vich ậ ệc trùng lặp.

Ví dụ:

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

8. Tránh s d ng OR trong các m<b>ử ụệnh đ thỏề</b> a mãn nhi<b>ều điều kiệ</b>n

Trong trường h p khi bạn tự h c SQL, m i khi bợ ọ ỗ ạn đặt ‘OR’ trong condition kết nối, truy v n sấ ẽ chậm đi ít nhất một hoặc hai thừa s . ố

Ví dụ: Truy v n g<i>ấốc: </i>

SELECT * FROM SH.costs c

INNER JOIN SH.products p ON c.unit_price = p.prod_min_price OR c.unit_price = p.prod_list_price;

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

SELECT * FROM SH.costs c

INNER JOIN SH.products p ON c.unit_price = p.prod_list_price;

<b>9. Tránh đặt hàm số bên phải của toán tử so sánh </b>

Các hàm s ố hay phương pháp rất thường được s d ng v i truy vử ụ ớ ấn SQL tương ứng. Viết lại truy v n b ng cách b các hàm t ng h p s ấ ằ ỏ ổ ợ ẽ tăng hiệu suất đáng kế, đặc biệ ới các t v

SELECT * FROM SH.sales

WHERE TRUNC (time_id) BETWEEN TRUNC (TO_DATE (‘12/01/2001’,’mm/dd/yyyy’)) AND TR (TO_DATE (‘12/30/2001’,’mm/dd/yyyy’));

10. Lo i b các phép toán th a <b>ạ ỏừ</b>

Khi làm hoặc tự ọ h c SQL, s có lúc b n thẽ ạ ực hiện các phép toán trong m t statement ộ của SQL. Các phép tốn có thể làm gi m hiả ệu suất đáng k nếu cách viết không phù hợp. ể Mỗi lần truy v n tìm th y m t hàng, nó s ấ ấ ộ ẽ thực hiệ ạn l i phép tốn. Vì v y, viậ ệc lo i bỏạ phép tốn khơng cần thiế ẽ giúp truy v n cht s ấ ạy nhanh hơn rất nhi u. ề

Ví dụ: Truy v n g<i>ấốc: </i>

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

Trong trường h p sử dợ ụng SELECT COUNT(*) để xác định s bản ghi thì thay bằng ố SELECT rows FROM sysindexes WHERE id= OBJECT_ID(‘table_name’).

12. S d ng store procedure (SP) <b>ử ụ</b>

Đố ới v i những thao tác được thực hiện thường xuyên và phức tạp, bạn nên sử d ng ụ SP để giảm lượng dữ li u truyệ ền đến máy chủ (thay vì b n ph i gửi câu l nh sql dài b n ch ỉạ ả ệ ạ cần gửi đi tên sp và danh sách tham số).

13. Tránh dùng CURSOR

Cursor không khác một vòng l p thao tác tặ ới từng b n ghi. Bả ản ghi đó sẽ ị b lock cho tới khi được x ử lý xong. Khi có thao tác tác động tới dữ liệ u c a cursor s gây ra l i. Trong ủ ẽ ỗ nhiều trường h p s d ng bợ ử ụ ảng temp để thay th ế cho cursor. Nếu có th hãy dùng bi n table ể ế trong My SQL (t phiên bừ ản 2008 đến nay) thay th ế cho bảng temp.

1. TDE là gì?

Mã hóa dữ liệ u trong suốt (Transparent data encryption – TDE) là một trong những cơ chế an tồn, cho phép mã hóa dữ liệu nhạy cảm được lưu trữ trong bảng và không gian

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

b ng. D ả ữ liệu được mã hóa và gi i mã trong suả ố ốt đ i với người dùng và các ng d ng có ứ ụ quy n truy c p vào d ề ậ ữ liệu. Để ngăn chặn vi c giệ ải mã trái phép, TDE lưu trữ các khóa mã hóa trong mơ-đun an tồn bên ngồi cơ sở ữ liệ d u (CSDL).

TDE thực hiện mã hóa và giải mã th i gian thờ ực các dữ liệu và các t p nhệ ật ký . Việc mã hóa s d ng khóa mã hóa d u (Data Encryption Key - ử ụ ữ liệ DEK) được lưu trữ trong bản ghi khởi động CSDL để ẵ s n sàng trong q trình phục hồi. Bên cạnh đó, TDE có khả năng b o v d ả ệ ữ liệu lưu trữ, nghĩa là các tệp d u và nh t ký. Nó cung c p kh ữ liệ ậ ấ ả năng tuân thủ nhi u luề ật, quy định và hướng dẫn được thiết lập trong các ngành công nghi p khác nhau. ệ Điều này cho phép các nhà phát triển phần mềm mã hóa dữ li u b ng cách sử d ng thuệ ằ ụ ật tốn mã hóa AES và 3DES mà không cần thay đổi các ứng d ng hi n có. ụ ệ

Người dùng và ng dứ ụng cơ sở ữ liệ d u khơng c n quầ ản lý lưu trữ khóa hoặ ạc to b ng ả ph , d ng xem và kích hoụ ạ ạt. Một ứng d ng x ụ ử lý dữ liệ u nh y c m có th s dạ ả ể ử ụng TDE để cung cấp mã hóa d u mữ liệ ạnh mẽ v i ít hoớ ặc khơng có thay đổi nào đối với ứng d ng. ụ

2.<b> Ưu điể</b>m và h n ch c a TDE <b>ạế ủ2.1. Ưu điểm </b>

TDE có các ưu điểm nổi b t sau:ậ

- Đảm b o an toàn các d u nh y cả ữ liệ ạ ảm trong trường hợp phương tiện lưu trữ hoặc t p d u b ệ ữ liệ ị đánh cắp.

- Tuân thủ các quy định liên quan đến an tồn.

- Khơng cần t o trình kích hoạ ạt hoặc chế độ xem để ả gi i mã dữ liệu cho người dùng hoặc ứng dụng được ủy quy n. D u t các bề ữ liệ ừ ảng được giải mã trong suốt cho người dùng và ng d ng CSDL. ứ ụ

- Các ng d ng không c n phứ ụ ầ ải sửa đổi để xử lý dữ liệu được mã hóa. Mã hóa và giải mã d ữ liệu được qu n lý bả ởi cơ sở ữ liệ d u.

- Hoạt động quản lý được tự động hóa. Người dùng hoặc ứng d ng không c n qu n lý ụ ầ ả khóa mã hóa.

2.2. H n ch <b>ạế</b>

Mặc dù có r t nhiều ưu điểm, nhưng TDE khơng cung cấấ p mã hóa trên kênh truy n ề thơng. Khi kích hoạt TDE, phải sao lưu chứng thư và khóa riêng gắn với chứng thư đó. Nếu chứng thư khơng có sẵn hoặc ph i khơi phả ục hay đính kèm CSDL trên một máy ch khác, ủ thì phải có bản sao lưu của cả chứng thư và khóa riêng. Nếu khơng, người dùng sẽ không th ể truy c p thành công CSDL. ậ

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

Bên cạnh đó, phải lưu lại chứng thư mã hóa ngay cả khi TDE khơng cịn được kích hoạt trên CSDL. Mặc dù, CSDL khơng được mã hóa, nhưng khóa mã hóa CSDL cần được lưu trữ vì có thể cần phải được truy c p cho mậ ột số hoạt động.

Mặt khác, việc các chứng thư được bảo v b ng mệ ằ ật khẩu sau khi chúng được sử d ng b i TDE s gây ra vi c CSDL không th truy cụ ở ẽ ệ ể ập được sau khi khở ội đ ng l ại.

3. <b> Các loạ</b>i mã hóa TDE

Có hai lo i mã hóa TDE: Mã hóa c t và mã hóa khơng gian b ng. Trong khi mã hóa ạ ộ ả cột TDE cho phép mã hóa dữ liệu nh y cạ ảm được lưu trữ trong các c ột của bảng được chọn, thì mã hóa khơng gian b ng TDE cho phép mã hóa tả ất cả ữ liệu được lưu trữ d trong một vùng b ng. ả

C mã hóa c t và mã hóa khơng gian bả ộ ảng TDE đều s d ng ki n trúc dử ụ ế ựa trên khóa hai t ng. Ngay c khi d ầ ả ữ liệu mã hóa được truy xu d ất, ữ liệu cũng không được hiển th cho ị đến khi quá trình giải mã được ủy quyền xảy ra, quá trình này là tự động cho người dùng được ủy quyền truy cập vào bảng.

3.1. Mã hóa c t TDE ộ

Mã hóa cột TDE được sử dụng để ả b o v d u nh y cệ ữ liệ ạ ảm, chẳng hạn như thẻ tín d ng và s an sinh xã hụ ố ội, được lưu trữ trong các cột của bảng. Lo i mã hóa này s d ng ạ ử ụ ki n trúc hai l p, dế ớ ựa trên khóa để mã hóa và gi i mã các cả ột bảng nh y cạ ảm. Trong đó, khóa mã hóa chính (Master encryption key) được sử dụng để mã hóa khóa bảng (Table key). Khóa mã hóa chính được lưu trữ trong một mơ-đun an tồn bên ngồi, có thể là ví (Wallet) ho c mơ-ặ đun an tồn phần c ng (HSM). Ch ng hứ ẳ ạn, đố ới hệi v qu n tr ả ị Oracle sử ụ d ng Oracle Wallet ho c mô-ặ đun an tồn phần cứng để lưu trữ khóa mã hóa chính.

<i>Hình 1. Q trình mã hóa cột TDE </i>

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

Việc lưu trữ theo cách này sẽ ngăn việc sử dụng trái phép các khóa mật và tách biệt các chức năng chương trình thơng thường khỏi các hoạt động mã hóa, giúp phân chia nhiệm vụ giữa người quản tr CSDL và quản tr an toàn, dị ị ẫn đến tăng cường khả năng bảo mật.

3.2. Mã hóa khơng gian b ng TDE ả

Mã hóa khơng gian bảng TDE cho phép mã hóa tồn b vùng b ng. Tộ ả ất cả các đối tượng được tạo trong khơng gian bảng sẽ được mã hóa tự động. Điều này bao gồm (các LOB) đối tượng lớn bên trong như BLOBs và CLOBs. Mã hóa khơng gian bảng TDE khơng mã hóa d ữ liệu được lưu trữ bên ngồi vùng b ng. Mã hóa khơng gian b ng TDE rả ả ất hữu ích nếu trong trường h p mu n b o v d u nh y c m trong các bợ ố ả ệ ữ liệ ạ ả ảng. Trường h p này, không ợ cần thực hiện phân tích chi tiết từng cột trong bảng để xác định các cộ ần mã hóa. t c

Ngồi ra, mã hóa khơng gian bảng TDE t n d ng mã hóa hàng lo t và b ậ ụ ạ ộ đệm để cung cấp hi u suệ ất nâng cao. Mặc dù tác động hiệu suất thự ế trên các ng d ng có thc t ứ ụ ể khác nhau, nhưng chi phí hiệu năng được ước tính trong kho ng t ả ừ 5% đến 8%.

ng TDE

<i>Hình 2. Quá trình mã h óa không gian bả</i>

Tất cả d ữ liệu trong một vùng bảng được mã hóa sẽ được lưu trữ ở định d ng mã hóa trên ạ đĩa. Dữ ệu đượ li c giải mã trong suốt cho người dùng được ủy quyền có các đặc quyền cần thiết đểđược xem hoặc sửa đổi dữ ệu. Người dùng hoặc ứng dụng CSDL không cần biết li liệu d ữ ệu trong m t b ng c li ộ ả ụ ể có được mã hóa trên đĩa hay không. Trong trường hợp các th t p d ệ ữ liệu trên đĩa hoặc phương tiện sao lưu bị đánh cắp, d u s không b xâm phữ liệ ẽ ị ạm.

Mã hóa khơng gian bảng TDE cũng sử dụng kiến trúc hai tầng (Hình 2), dựa trên khóa để mã hóa trong suốt và giải mã khơng gian bảng. Khóa chính TDE cũng có chức năng và cách thức lưu trữ như mã hóa cột TDE.

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

Mã hóa khơng gian bảng TDE cũng cho phép phạm vi chỉ mục quét dữ liệu trong khơng gian bảng được mã hóa. Điều này là khơng th v i mã hóa c t TDE. ể ớ ộ

Lưu ý, dữ ệu mã hóa đượ li c bảo vệ trong các hoạt động như JOIN và SORT. Điều này có nghĩa là dữ ệu đượ li c an tồn khi nó được di chuyển đến các vùng bảng tạm thời. Dữ liệu trong nh t ký hoàn tác và làm lậ ại cũng được bảo v . ệ

4. Các thu t tốn mã hóa sau h<b>ậỗ trợ</b> trong SQL Server

TDE trong SQL Server hỗ trợ các thu t tốn mã hóa sau: ậ

Triple DES (tiêu chu n mã hóa d <b>ẩữ liệu) 168-bit </b>

5.<b> Các bước bậ</b>t Mã hóa d u minh b ch (TDE) <b>ữ liệạ</b>

<small>• </small> Tạo khóa chính.

<small>• </small> Tạo hoặc lấy ch ng ch ứ ỉ được bảo v b i khóa chính. ệ ở <small>• </small> Tạo khóa mã hóa cơ sở dữ liệu và bảo vệ nó bằng chứng chỉ. <small>• </small> Đặt cơ sở dữ liệu để sử dụng mã hóa.

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

d, Liên k t ch ng ch vế ứ ỉ ới Cơ sở ữ liệ d u: CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128

ENCRYPTION BY SERVER CERTIFICATE SecurityCertificate; GO

e, Bật mã hóa trên Cơ sở dữ liệu: ALTER DATABASE Database_Name SET ENCRYPTION ON;

GO

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

<b>BẢNG ĐÁNH GIÁ THÀNH VIÊN NHÓM 3</b>

</div>

×