PDA

View Full Version : Phân trang của thèng Asp.net 2.0



nt253vn
02-09-2004, 03:46
Mình có coi cái phân trang của nó, nó tạo 1 bảng tạm rồi bỏ những record vào trong đó rồi lấy ra
SP: forums_GetUsersByName

-- Create a temp table to store the select results
CREATE TABLE #PageIndexForUsers
(
IndexID int IDENTITY (1, 1) NOT NULL,
UserID int
)

-- Insert into our temp table
INSERT INTO #PageIndexForUsers (UserID)
SELECT
U.UserID
FROM
forums_Users U,
forums_UserProfile P
WHERE
U.UserID = P.UserID AND
UserAccountStatus = 1 AND
EnableDisplayInMemberList = 1 AND
UserName like '%' + @UserNameToFind + '%'
ORDER BY
DateCreated

Vậy trường hợp 100 user truy cập web đang coi list member chẳng hạn, thì nó cũng tạo 100 temp table hả bè con ??

Nếu vậy nó làm sao để tránh tên table trùng nhau ? Rồi cái log file nó tăng lên như vó nữa thì seo ??

KEM_WALL
02-09-2004, 08:40
temp tbl thì đâu có bị trùng tên đâu muh lo.
còn cái log không tăng nhiều đâu (không tin thử tính :D).

White Rose
02-09-2004, 16:08
temp tbl thì đâu có bị trùng tên đâu muh lo.
còn cái log không tăng nhiều đâu (không tin thử tính :D).
chat chit?
------------
Bạn lưu ý lại code trong SP của nó. Dấu # biểu đạt cho temporary table, điều này có nghĩ là kết thúc SP thì cái table này cũng tự động bị remove. Hơn nữa trong một database hoàn toàn có thể có nhiều table có cùng tên, còn phục thuộc vào owner, scope.. nữa.

Có một ý kiến phân trang (có vẻ) tốt hơn là sử dụng biến table với cú pháp

DECLARE @temp_table TABLE(IndexID int IDENTITY (1, 1) NOT NULL,UserID int)
Sau đó tiến hành như cách trên. Cách này, thay vì tạo table trên database Temp, tạo table trên memory.

Một cách nữa được cho là tốt nhất là sử dụng RowCount để tiến hành phân trang.

Cả 3 cách trên đều hoạt động tốt nếu như table cần paging có một PK.

Với các trường hợp còn lại, giải pháp được coi là tối ưu giữa việc dung hoà tốc độ + tài nguyên là sử dụng CURSOR.

More: Các cách trên (thực ra còn đến 3, 4 cách nữa, hic) đều có thể tìm thấy ví dụ trên net.