Mình tìm hiểu từ nhiều nguồn và rút được một tí kinh nghiệm như vầy : nếu select từ table duy nhất trong csdl thì câu lện thực thi sẽ trả về kết quả cực kỳ nhanh.

ví dụ: select ROW_NUMBER() OVER (ORDER BY a.HANG_HOA_ID asc) AS ROW,HANG_HOA_ID from DM_HH

vì vậy mình thấy khi phân trang nếu làm như sau thì kết quả trả về cực nhanh đối với csdl hơn 30.000 dòng trở lên (mình đã test trên 20 000 recode)
đầu tiên mình có 2 biến đầu vào
@currPage INT : page hiện tại
@recodpage : số dòng của 1 trang
as
kế đến :
DECLARE @so_dong NUMERIC(18,0)
SET @so_dong = (SELECT COUNT(*) FROM HH_DANH_MUC_HANG_HOA WHERE SU_DUNG = 1)

SELECT ROW, HANG_HOA_ID, SO_DONG INTO #TABLE
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY a.HANG_HOA_ID asc) AS ROW,a.HANG_HOA_ID,@so_dong AS SO_DONG
FROM HH_DANH_MUC_HANG_HOA a
WHERE a.SU_DUNG = 1
)M
WHERE ROW BETWEEN(@currPage-1)*@recodperpage+1 AND @currPage*@recodperpage

và lấy kết quả trang cần lấy

SELECT a.HANG_HOA_ID,HANG_HOA_MA,HANG_HOA_TEN,.........
c.SO_DONG
FROM HH_DANH_MUC_HANG_HOA a
LEFT OUTER JOIN PHN_NHA_CUNG_CAP b ON a.NCC_ID=b.NCC_ID,
HH_NHOM_HANG d,#TABLE c
where a.NHOM_ID = d.NHOM_ID
and a.SU_DUNG=1 AND a.HANG_HOA_ID= c.HANG_HOA_ID

(nếu muốn sort các bạn nên sort trên gridView như vẫy dữ liệu sẽ load nhanh hơn)

nói là chia sẽ thật sự những gì mình viết có thể các bạn đều biết hết rồi, mong các bạn có ý kiến đánh giá.