Thứ Bảy, 14 tháng 6, 2014

Những lời khuyên hữu ích khi làm viêc với SQL

Nếu bạn muốn có hiệu quả tốt nhất khi làm việc với SQL, giảm thiểu sai sót và nhận được hiệu suất truy vấn tốt. Bạn nên tham khảo nhưng điểm tối sẽ nêu dưới đây. 
                    
1. Tối ưu thiết kế SQL
- Dánh partition những table có dữ liệu lớn(Từ 2G trở lên)
+ Với dữ liệu lịch sử thì đánh theo By Range;
+ Với dữ liệu xác định trước được giá trị thì đánh theo By list;
+ Với dữ liệu không có quy luật thì đánh theo By Hash.
- Đánh index những trường hay tìm kiếm(Ưu tiên number)
- Đối với những table có dữ liệu lớn:
+ Hạn chế dùng khóa ngoại
+ Hạn chế dùng Trigger
+ Nếu có tần suất update & insert lớn không nên dùng khóa chính.

2. Tối ưu câu lệnh truy vấn và tác động vào các bảng đã đánh partition, indexing
- Tất cả các câu lệnh đều phải có index, không câu lệnh nào được quét full bảng.
- Nếu bảng có partition thì trong điều kiện câu lệnh phải có thêm trường partition, ngoại trừ 1 số trường hợp đặc biệt
- Khi join 2 bảng với nhau thì bảng có dữ liệu lớn hơn phải có index
- Trong câu lệnh không dùng điều kiện is null, phải chuyển sang phương án dùng các toán tử : >, < = ….
- Với các bảng tmp có dữ liệu trong quá trình chạy và xóa dữ liệu sau khi chạy (không cần backup dữ liệu) :
+ Tạo bảng ở chế độ Nologging
+ Khi insert phải dùng /*+Append*/
+ Nếu muốn xóa cả bảng hoặc 1 partition của bảng phải dùng câu lệnh truncate.
+ Hạn chế sử dụng câu lệnh update, cần tối ưu câu lệnh insert và select

3. Yêu cầu trong các câu lệnh tạo View:
- Trong view không thêm trường ’ảo’ của Database vì khi câu lệnh select vào view có thể sẽ bị quét full bảng.
- Hạn chế sử dụng view lồng nhau, tối đa chỉ dùng 2 view lồng nhau
- Nếu cần hint index trong câu lệnh truy vấn vào view thì cần hint trong câu lệnh tạo view, không hint vào trong câu lệnh select vào view

4. Yêu cầu tối ưu câu lệnh truy vấn vào Database
- Yêu cầu tối ưu lệnh select:
+ Không thực hiện select * dữ liệu trong bảng, phải chỉ rõ các trường cần select
+ Chỉ thực hiện select số num row cần sử dụng  (càng ít num row hiệu suất truy vấn dữ liệu càng nhanh)
- Giảm thiểu số lượng Subqueries trong truy vấn
- Sử dụng IN và EXISTS một cách thích hợp trong câu lệnh truy vấn
- Sử dụng EXISTS và DISTINCT khi join các bảng có quan hệ 1 nhiều
- Thay thế UNION ALL cho UNION
- Yêu cầu với câu lệnh WHERE
+ Điều kiện where khi dùng is not phải chuyển sang dùng các toán tử : >, < =
+ Điều kiện where khi dùng điều kiện kép lớn hơn hoặc nhỏ hơn trong khoảng, phải chuyển sang sử dụng BETWEEN
- Sử dụng JOIN thay cho Subqueries để tăng hiệu suất truy vấn
- Không sử dụng toán tử OR trong câu lệnh truy vấn bảng có dữ liệu lớn
- Đánh index cho foreign key trên bảng con