Archive for August, 2009

FBI

August 18, 2009

Hôm nay tự nhiện thấy hứng nên mình lại viết tiếp, lý do hứng mình không tiện nêu ra ở đây

Nhìn cái title này thể nào các bạn cũng nghĩ mình đang đề cập đến Cục An Ninh Liên Bang Mỹ, xin thưa, mình chả liên quan x gì đến bọn đấy cả. Cái mình muốn nói ở đây chính là Function Based Index.

FBI đến đây chắc các bạn cũng biết là gì rồi, chính là B-Tree Index được đánh trên một hàm với tham số là một số cột trong bảng.

Chẳng hạn trong Oracle, để tìm tên Nguyen Van An thì thông thường câu điều kiện ở mệnh đề Where phải là Where upper(name) =’NGUYEN VAN AN’ Hoặc Where lower(name) = ‘nguyen van an’ chứ Where name = ‘Nguyen Van An’ risk hơi bị cao vì ai mà biết end user nhập như thế nào. (ở SQL Server không bị cái này vì SQL Server không phân biệt chữ hoa chữ thường).

Nếu table của bạn đã có index trên trường name, với trường hợp trên index đó cũng không được sử dụng, không tin nhìn execution plan mà xem. Bạn phải dùng index đánh trên hàm upper hoặc lower.

Ở các database khác mình không biết, chứ ở Oracle muốn làm được FBI các bạn phải có các quyền sau: QUERY REWRITE, GLOBAL QUERY REWRITE đồng thời phải set 2 tham số QUERY_REWRITE_ENABLED=TRUE and QUERY_REWRITE_INTEGRITY=TRUSTED.

Đối với FBI trên các hàm trả về varchar2, các bạn cũng lưu ý về length của chuỗi trả về đôi khi có thể quá lớn đối với Index (phụ thuộc vào blocksize của tablespace mà index nằm trên đó)

Vậy ưu nhược điểm của FBI là gì? Lần này mình sẽ nói đến cái dở trước.

Nhược

Đầu tiên dễ nhận thấy là nó sẽ tác động đáng kể đến thời gian đánh index. Hàm càng phức tạp, càng rối rắm thì thời gian càng lâu.

Thứ hai, nó cũng ảnh hưởng nhiều đến các lệnh Insert và Update. Nếu ứng dụng của bạn liên tục insert và update với khối lượng lớn thì nên cân nhắc cẩn thận.

Và cuối cùng là lưu ý về độ dài của hàm sẽ được đánh index như đã nói ở trên (giải lao 1 tý, :), câu này mình lại thuổng của bác Lê Dũng, càng ngày mình càng hâm mộ bác. Ai có sở thích giống mình thì tìm đọc the best-seller “Những phát ngôn làm thay đổi thế giới” – Tuyển tập 1000 tuyên bố ngoại giao của ông Lê Dũng, Bộ Ngoại Giao Việt Nam. Đồng thời các bạn có thể xem thêm một số tuyên bố của ông tại http://www.google.com.vn/search?hl=vi&q=%22L%C3%AA+D%C5%A9ng%22+Vi%E1%BB%87t+Nam+c%E1%BB%B1c+l%E1%BB%B1c+ho%C3%A0+b%C3%ACnh&btnG=T%C3%ACm+ki%E1%BA%BFm&meta=http://www.google.com.vn/search?hl=vi&q=%22L%C3%AA+D%C5%A9ng%22+Vi%E1%BB%87t+Nam+ph%E1%BA%A3n+%C4%91%E1%BB%91i&btnG=T%C3%ACm+ki%E1%BA%BFm&meta= Rất nhiều phát biểu của ông đã trở nên quá quen thuộc với khán thính giả Việt Nam, chỉ cần ông đứng trước bục là bạn đã biết ông sắp nói gì :))

Ưu

Hết giờ giao lao, quay trở lại ưu điểm của FBI, ngoài việc làm cho câu query nhanh hơn (lại lưu ý các bạn không phải lúc nào index cũng nhanh hơn đâu nhé – xem lại bài viết cũ của mình về index), FBI còn có một số “tiểu xảo” khá thú vị mà không loại index nào có thế có. Gọi là tiểu xảo vì nó không dựa vào bản chất thực của FBI mà lại dựa vào tính chất không chứa các entries có giá trị rỗng của B-Tree index:

  • Các bạn có thể tưởng tượng có loại index nào mà chỉ đánh index trên một số dòng trong một table không? Giả sử có table A có khoảng 1M records, table này có cột status có 1 vài giá trị, trong đó số rows mà status =’A’ chỉ có khoảng 1500. Bạn chỉ cần dùng FBI như sau: Create index A_Status_Idx on A(decode(status,’A’,’A’, null)); Vì B-Tree sẽ ignore tất cả các giá trị null nên index vừa tạo thực sự chỉ khoảng 1500 lá nên tốc độ của nó khi where status =’A’ (sẽ phải viết thành decode(status,’A’,’A’, null) =’A’) là nhanh kinh hoàng luôn.
  • Một tiểu xảo nữa là lợi dụng FBI để tạo ra các complex contraints. Ví dụ các project chỉ có 2 trạng thái là ACTIVE và INACTIVE, constraint ở đây là khi project ở trạng thái ACTIVE thì name của nó bắt buộc phải là Unique, còn INACTIVE thì vô 4. Cái này mình thật, các bạn viết code manually thì cứ gọi là như trâu kéo cày luôn, mà chắc x gì chạy đã ngon. Rất đơn giản chỉ cần: Create unique index active_projects_must_be_unique On projects (case when status = ‘ACTIVE’ then name end );

Tóm lại là khoa học kỹ thuật bây giờ rất chi là “mênh mang tình dân” (@bác Phiêu mình), hỗ trợ đến tận răng, nên các bạn cứ thoái mái mà lựa chọn.

FBI trông thế mà tiện ích ra phết.

Các bạn n(g)hỉ?

18/08/2009

HN

p/s: À, bài viết của mình chỉ có tác dụng cho Oracle nhé, các database khác chưa kiểm chứng nhưng mình tin là được.

Advertisements