SQL for paging

Hôm trước có một anh bạn hỏi mình trong MS SQL server có câu lệnh phân trang không. Mình trả lời là có nhưng chạy chậm. Anh bạn mình bảo, dạo này bọn mạng (http://www.15seconds.com/issue/070628.htm) hay sử dụng các câu lệnh phân trang kiểu này, em xem thế nào.

SELECT *
FROM   (SELECT ROW_NUMBER() OVER(ORDER BY person) AS
rownum, person, income FROM Salaries) AS Salaries1
WHERE  rownum >= 5 AND rownum <= 9
ORDER BY income

Nhìn câu này mình phán luôn câu này chỉ dùng cho các bảng dữ liệu be be’ chứ to to 1 tý là đi về nơi xa ngay. Mình chứng minh cho các bạn thấy ngay đây. Ở sub-query, các bạn phải full-scan table 1 phát, rồi lại thêm 1 cái fake column là cái cột salaries1 kia, tiếp đến câu lệnh Select * where rownum >= 5 AND rownum <= 9, lại phải full scan table phát nữa vì làm gì có index nào trên cái rownum kia. Chưa kể cả ở 2 câu, các bạn đều dùng Order by nữa. Nếu dữ liệu của các bạn vào loại lớn (tất nhiên là tầm vài chục M records, chứ vài K thì nói làm x gì?), tốc độ phân trang của các bạn sẽ là “phố của bò”. Bạn nào không tin thì mời bạn nhòm vào execution plan của câu lệnh.

Cũng có một số trang đề xuất dùng CTE, nhưng kết quả thì cũng như trên thôi, chả hơn x gì.

Theo ý mình thì nên làm thế này. Các bạn nên viết thành một SP, trong đó có 2 câu lệnh:

Câu lệnh đầu tiên chỉ là select top 500, lấy ra 500 bản ghi thôi. Các tips và tricks giời thì cũng không lại được câu lệnh cơ bản này, chả phải where iếc gì mà cũng chả cần subquery làm gì cho nó mệt mỏi. Cá nhân mình cho rằng, câu lệnh tìm kiếm mà trả về hơn 500 bản ghi là câu lệnh vô nghĩa, hơi sức x đâu mà xem chi tiết ngần đấy bản ghi. Muốn tìm chính xác thì mời các bạn thêm điều kiện vào.

Câu lệnh thứ 2, các bạn select count(*) cho mình để trả về chính xác số lượng bản ghi thoả mãn điều kiện tìm kiếm

Như vậy, trên màn hình của các bạn sẽ hiển thị 2 thông tin: cái grid của các bạn chỉ chứa 500 records, nhưng tổng số bản ghi là con số chính xác. Bạn nào thật thà thì nói với nhân dân là tao chỉ hiển thị 500 trên tổng số xxx bản ghi. Còn không thì lờ luôn đi cũng được.

HN

Advertisements

Tags: ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


%d bloggers like this: