วิธีการแบ่ง Page ASP.Net ด้วย SQL Server 2005
หลายครั้งที่ต้อง Mantenance เว็บใหญ่ๆ ที่ทำด้วย Asp.net และ Sql server ซึ่งมักจะเจอปัญหา Page load ช้า เนื่องจาก Query ข้อมูลจำนวนมากจาก ฐานข้อมูล เพื่อมาเก็บไว้ใน DataTable แล้วเราก้อค่อย แบ่ง page จากข้อมูลใน DataTable อีกที
ลองนึกภาพดูนะครับ ถ้าเรามีข้อมูลในเว็บบอร์ดที่มีคนออนไลน์พร้อมกัน หลายๆ พันคน และมีจำจวนข้อมูลที่ต้อง Query จากฐานข้อมูล เป็น แสน Records เราอาจจะไม่เอามาทั้งหมด โดยอาจจะให้แสดงย้อนหลังได้เพียบ 10 หน้า โดยแสดงหน้าละ 150 รายการ รวมกันทั้งหดม ก้อ 1500 Records ที่เราต้อง Query จาก Database ของเรา แล้วต้องมาเสียเวลา แบ่งหน้าด้วย Pagging หรือ โดยใช้ Feature ของ DataGrid ซึ่งทำให้ช้าเป็นอย่างมาก โดยเฉพาะตัว DataGrid เองก้อทำงานช้ามากอยู่แล้ว
แล้วก้อจะเจอคำถามอยู่บ่อยๆ ว่า ทำไม Sql Server ถึงไม่มี Limit เหมือนกับ MySQL จะได้ช่วยให้แบ่าง Page ได้ง่ายๆ
วันนี้ผมเอาวิธีการ ที่เหมือนกับ Select Limit มาฝากกันครับ
อันดับแรก เราต้องกำหนด ID ให้กับ ข้อมูลใน ฐานข้อมูลก่อน โดยใช้ ROW_NUMBER()
SELECT ... FROM (SELECT ... ROW_NUMBER() OVER(ORDER BY ColumnName) AS RowNum FROM Employees e ) AS DerivedTableName WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1
หลังจากนั้น เราก้อกำหนดค่าให้กับ @startRowIndex และก้อ @maximumRows คับ ว่าจะให้เริ่มต้นจาก Record ไหน และก้อจำนวนเท่าไหร่
เช่น
SELECT RowNum, EmployeeID, LastName, FirstName FROM (SELECT EmployeeID, LastName, FirstName ROW_NUMBER() OVER(ORDER BY EmployeeID) AS RowNum FROM Employees e ) AS EmployeeInfo
แค่นี้ก้อจะสามารถแบ่ง Query เป็น ช่วงๆ ได้เหมือน Limit ใน MySQL ได้แล้วครับ
หรืออาจจะเอามาประยุกต์ใช้ เป็นแบบนี้ก้อได้นะครับ
DECLARE @startRowIndex INT DECLARE @maximumRows INT DECLARE @page INT SET @maximumRows = 200 SET @page = 3 SET @startRowIndex = (@page * @maximumRows) - @maximumRows; IF @page > 1 BEGIN SET @startRowIndex = (@startRowIndex + 1) SET @maximumRows = (@maximumRows -1) END SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY USERNAME) AS ROWNUM, USERNAME, FNAME, LNAME, EMAIL FROM MEMBER ) AS DerivedTableName WHERE ROWNUM BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows)
ได้ผลเป็นยังไงแวะกลับมาเล่าสู่กันฟังบ้างนะครับ
เปิดให้ดาวน์โหลดมาทดลองใช้กันได้แล้วครับ กูเกิล โครม เบราเซอร์ จากกูเกิล ซึ่งตอนนี้ยังเป็นตัว beta อยู่ แต่ในอนาคตอาจมีผู้ใช้เยอะ จนผมต้องทำเว้บให้ support เจ้าตัวนี้ด้วยก็ได้ เท่าที่ทดลองใช้ดู ก็เปิดหน้าเว็บต่างๆ ได้ปกติดีครับ ช่องเสิชกับช่อง address bar เป็นช่องเดียวกัน menu bar ไม่มี หรือมีแต่หาไม่เจอไม่รู้ เดี๋ยวลองใช้สักพัก ถ้ามีไรน่าสนใจใหม่ๆจะมาบอกแล้วกันครับ ทดลองโหลดไปใช้กันที่นี่ครับ ดีไม่ดียังไงบอกกันมั่งเน้ออ
Dynarch Calendar TLE