วัตถุประสงค์ของบทความนี้คือเพื่อให้ทราบถึงการเรียกดูข้อมูลขนาดใหญ่แบบเพจและปรับความเร็วให้เหมาะสม
ในการสร้างเว็บแอปพลิเคชัน ฟังก์ชันการเรียกดูเพจถือเป็นสิ่งสำคัญ ปัญหานี้เป็นปัญหาที่พบบ่อยที่สุดมาเป็นเวลานาน และได้รับการแก้ไขอย่างดีแล้ว คุณลักษณะ PageSize ของออบเจ็กต์ ado คำนวณหน้าตามจำนวนระเบียนทั้งหมด จากนั้นข้ามไปที่ชุดระเบียนแล้วส่งออก นอกจากนี้ ยังมีวิธีเขียนขั้นตอนที่เก็บไว้เพื่อใช้ข้อมูลเพจแต่ละด้านก็มีข้อดีและข้อเสียในตัวเอง ด้านล่างนี้ฉันจะแนะนำอัลกอริธึมการเพจที่รวดเร็วมากในโครงการจริง
ประเด็นสำคัญ: SQL (ใช้งานโดยใช้ TOP และการกำหนดหมายเลขอัตโนมัติ)
สคริปต์หน้า (ฟังก์ชันทางเลือกของเบราว์เซอร์)
:
IIS/เซิร์ฟเวอร์ SQL/การเข้าถึง
โครงสร้างตาราง:
สร้างตารางเนื้อหาตาราง (
IDENTITY หมายเลขอัตโนมัติ (int, 1,1) ไม่เป็นโมฆะ
รหัสการจำแนกประเภท<I>var</I>char(20) null
หัวข้อ<I>var</I>ถ่าน(255) NULL,
เนื้อหา<I>var</I>ถ่าน(4000) เป็นโมฆะ
เวลา วันที่ เวลา เป็นโมฆะ
)
หลักการดำเนินการ:
ตารางนี้ถูกตั้งค่าด้วยฟิลด์การเรียงลำดับเลขอัตโนมัติ คุณลักษณะของฟิลด์นี้คือการสร้างรูปร่างที่ไม่ซ้ำกัน ซึ่งรวมถึงฟิลด์จะยังคง 'ไหล' หลังจากลบเรกคอร์ด (หมายเหตุ: โดยปกติแล้วในการสร้างตารางระบบ สิ่งนี้ ไม่ค่อยได้ใช้ เนื่องจากไม่สามารถจัดการหมายเลขได้อย่างอิสระ แต่ใช้ที่นี่เป็นหลักเนื่องจากฉันต้องการละเว้นรหัสสำหรับการบำรุงรักษาหมายเลขในบทความ)
การแบ่งหน้า:
จากนั้น ขั้นตอนแรกคือการสืบค้นข้อมูลของเพจ หากมี 100 เรคคอร์ดและ 20 เรคคอร์ดถูกใช้สำหรับหนึ่งเพจ ดังนั้นอัลกอริธึมการเพจปกติคือ "จำนวนเพจทั้งหมด = เรคคอร์ดทั้งหมดหารด้วยจำนวนควบคุมของเพจ [ถ้า มีจำนวนหน้าที่เหลือคือจำนวนหน้าทั้งหมดบวกหนึ่ง ]" วิธีการนี้นำไปสู่ความจำเป็นในการสร้างชุดบันทึกขนาดใหญ่ของบันทึกทั้งหมด ดังนั้น บางคนจึงเสนอให้ใช้อัลกอริธึมการเพจของขั้นตอนการจัดเก็บ วิธีแรกคือ asp สคริปต์เพื่อสร้างชุดบันทึกขนาดใหญ่ซึ่งค่อนข้างช้าและอย่างหลังกำลังฆ่าไก่ แม้ว่าฉันจะเขียนขั้นตอนการจัดเก็บบ่อยครั้งตามความคิดของฉัน แต่ฉันพบว่าการเขียนขั้นตอนการจัดเก็บนั้นซ้ำซ้อนโดยสิ้นเชิง
ใน SQL เพื่อนหลายคนที่ยังใหม่รู้จักบทบาทของคีย์เวิร์ดที่มีการแก้ไขยอดนิยม เช่น เลือก TOP 1 * จาก table1 -- ด้วยวิธีนี้ ชุดระเบียนที่มีเพียงระเบียนเดียวจะถูกส่งกลับจากตาราง Table1 เป้าหมายของการเพิ่มประสิทธิภาพเพจคือการหลีกเลี่ยงการสร้างชุดบันทึกที่มีขนาดใหญ่เกินไปสามารถควบคุมได้อย่างสมบูรณ์ผ่าน TOP ขณะนี้ตารางแบบสอบถามควรเลือกการกำหนดหมายเลขอัตโนมัติ 20 อันดับแรก เนื้อหา และเวลาจากตารางเนื้อหา
แต่ตอนนี้ยังคงมีปัญหาอยู่ นั่นคือวิธีการวางตำแหน่ง มันเป็นไปไม่ได้ที่ Top จะวางตำแหน่งและส่งออกหน้าใดหน้าหนึ่งให้เราโดยอัตโนมัติ นี่คือจุดที่ส่วนคำสั่งได้รับการออกแบบให้แสดงเนื้อหาที่ถูกต้องตามเงื่อนไขเฉพาะ หมายเหตุ: การเรียงลำดับตามบันทึกมีความสำคัญมาก ซึ่งเป็นตัวกำหนดความสำเร็จหรือความล้มเหลวของอัลกอริทึมนี้
การสาธิตที่นี่คือวิธี DESC ซึ่งจัดเรียงในลำดับย้อนกลับ ตัวอย่างเช่น สำหรับการอัปเดตซอฟต์แวร์บนเว็บไซต์ การอัพเดตล่าสุดจะถูกวางไว้ก่อน และนี่คือวิธีลำดับย้อนกลับ
เอาล่ะ มาดูโค้ดจริงกันก่อน
หรี่ strSQL, i, endID, isBeginPage
const Cnt_PageSize = 20 'กำหนดขนาดของแต่ละหน้าของเรคคอร์ด'
'พิจารณาว่าเป็นการดำเนินการเพื่อเข้าสู่หน้าถัดไปหรือไม่โดยการตรวจสอบค่าของพารามิเตอร์เพจที่ส่งผ่านโดยเบราว์เซอร์
isBeginPage = isEmpty(request("Page")) or request("Page")="" หรือ request("Page")<>"next"
'นี่คือหลักของเพจ
ถ้า isBeginPage แล้ว 'ถ้าเป็นหน้าเริ่มต้น'
'Query = แสดงรายการบันทึกที่มีรหัสการจำแนกประเภทเท่ากับพารามิเตอร์ flbm ในลำดับย้อนกลับ และแสดงรายการเฉพาะปากกา Cnt_PageSize ตัวแรก (Cnt_PageSize เป็นคำจำกัดความคงที่ เช่น 20)
strSQL = "select TOP " & Cnt_pageSize & " การกำหนดหมายเลขอัตโนมัติ, ชื่อ, เนื้อหา, เวลาจากตารางเนื้อหาโดยที่ Classification encoding = '" & TRIM(SQLEncode(request("flbm"))) & "' เรียงลำดับตามคำอธิบายการกำหนดหมายเลขอัตโนมัติ"
อย่างอื่นถ้าไม่ใช่หน้าเริ่มต้น
if request("Page")="next" ดังนั้น 'สิ่งนี้ถูกเขียนขึ้นที่นี่เพื่อปรับปรุงประสิทธิภาพของโค้ด หากพารามิเตอร์อยู่ถัดไป หมายความว่าจะนำเนื้อหาของเพจ
'Query = แสดงรายการบันทึกที่มีรหัสการจำแนกประเภทเท่ากับพารามิเตอร์ flbm และควรน้อยกว่าหมายเลข endID อัตโนมัติ (endID ก็เป็นพารามิเตอร์ด้วย) และเรียงลำดับในลำดับย้อนกลับ และแสดงรายการเฉพาะปากกา Cnt_PageSize แรกเท่านั้น (Cnt_PageSize คือ คำจำกัดความคงที่ เช่น 20)
strSQL = "select TOP " & Cnt_pageSize & " การกำหนดหมายเลขอัตโนมัติ, ชื่อ, เนื้อหา, เวลาจากตารางเนื้อหาโดยที่ Classification encoding = '" & TRIM(SQLEncode(request("flbm"))) & "' และการกำหนดหมายเลขอัตโนมัติ<" & request ("endID") & " เรียงลำดับตามหมายเลขอัตโนมัติ คำอธิบาย"
จบถ้า
สิ้นสุดถ้า
'เปิดการเชื่อมต่อข้อมูลเพื่อดำเนินการ SQL และสร้างชุดบันทึก
ตั้ง rs = Cnn.Execute (strSQL)
ถ้าไม่ใช่ rs.Eof ให้เขียนที่นี่เพื่อพิจารณาว่าเป็น Eof หรือไม่ แต่มีความหมายพิเศษที่นี่
เรียก TableTitle 'นี่คือฟังก์ชันที่เขียนเองซึ่งใช้ในการสร้างแท็กตาราง
โทร startTr 'นี่คือเครื่องหมาย tr เพื่อสร้างตาราง
สำหรับ i=0 ถึง rs.fields.Count-1 'สำรวจเขตข้อมูลชุดระเบียน
โทร AddCol(rs(i).name) 'ชื่อฟิลด์เอาท์พุต
ต่อไป
เรียก endTr
ในขณะที่ไม่ใช่ rs.eof 'วนซ้ำเนื้อหาของชุดบันทึกและเอาต์พุต
เรียก startTr
สำหรับ i=0 ถึง rs.fields.Count-1
โทร AddRow(ASPEncode(rs(i).value))
ต่อไป
วางสายTr
endID = rs("การกำหนดหมายเลขอัตโนมัติ") 'ที่นี่จะบันทึกค่าการกำหนดหมายเลขอัตโนมัติของแต่ละเอาต์พุต
rs.MoveNext
เวนด์
เรียก TableBottom 'จนถึงตอนนี้ เพียงแค่ส่งออกเนื้อหาทั้งหมดของชุดบันทึก
'เครื่องหมายเปลี่ยนหน้าจะถูกส่งออกที่นี่ vbaIIF เป็นฟังก์ชันที่เขียนเอง
ต้นแบบคือ <I>ฟังก์ชัน</I> vbaIIF(a,b,c)
ถ้าเป็นอย่างนั้น
vbaIIF=b
อื่น
vbaIIF =ค
สิ้นสุดถ้า
สิ้นสุด <I>ฟังก์ชัน</I>
การใช้งานเพจก่อนหน้านี้ทำได้โดยการเรียกฟังก์ชันของเบราว์เซอร์ history.back(1) ผ่านสคริปต์ จากนั้นจึงไม่จำเป็นต้องสร้างข้อมูลใหม่ในฝั่งเซิร์ฟเวอร์เมื่อกลับมาที่เพจ และไม่จำเป็นต้องคำนึงถึงความเร็ว .
เมื่ออยู่ในหน้าแรก ลิงก์ไปยังหน้าก่อนหน้าควรไม่ถูกต้อง ซึ่งทำได้ผ่าน vbaIIF(isBeginPage, "disabled", "") หากเป็นหน้าแรก ให้เพิ่มแอตทริบิวต์ที่ปิดใช้งานลงในแท็ก ไม่ใช่หน้าแรกให้เพิ่มคำสั่ง history.back (1) สคริปต์ที่ใช้ในการย้อนกลับหน้าการเรียกดู
หน้าถัดไปคือการส่งพารามิเตอร์ Page และพารามิเตอร์ endID หน้าถูกตั้งค่าเป็นถัดไปเพื่อระบุการกระทำของหน้าถัดไป ระบุหมายเลขสิ้นสุดของชุดระเบียนปัจจุบัน และหน้าถัดไปจะถูกแบ่งหน้าจากนี้
response.Write("〈a href=""#"" onclick=""java<I>script</I>:" & vbaIIF(isBeginPage,"","history.back(1);") & "" " " & vbaIIF(isBeginPage," Disable ","") & "〉หน้าก่อนหน้า〈/a〉|〈a href=""TypeOptions.asp?flbm=" & request("flbm") & "&Page=next&endID = " & endID & """〉หน้าถัดไป〈/a〉")
อื่น
'ที่นี่ โดยการตัดสินว่าชุดบันทึกว่างเปล่าหรือไม่ เราสามารถแก้ปัญหาการพลิกหน้าต่อไปจนถึงหน้าสุดท้ายได้
ถ้าไม่ใช่ BeginPage แล้ว
'ตรวจสอบว่าเป็นบันทึกเปล่าและไม่ใช่หน้าเริ่มต้น จากนั้นสร้างสคริปต์สำหรับหน้าย้อนกลับ ผลก็คือหลังจากเข้าสู่หน้า มันจะกลับไปยังหน้าก่อนหน้าโดยอัตโนมัติ
response.Write "〈<I>script</I> language=java<I>script</I>〉" & vbCrlf
การตอบสนองเขียน "history.back(1); & vbCrlf
การตอบสนองเขียน "〈/<I>สคริปต์</I>〉"
การตอบสนองสิ้นสุด
else 'หากเป็นเรกคอร์ดหน้าเริ่มต้น มันจะว่างเปล่า และจะแจ้งว่าไม่มีเนื้อหา
Response.Write "〈font color=blue〉ไม่มีเนื้อหาในหมวดหมู่นี้〈/font〉"
สิ้นสุดถ้า
สิ้นสุดถ้า
สรุป: ด้วยสคริปต์ส่วนหน้าและทักษะการสืบค้น SQL โปรแกรมเพจจิ้งประสิทธิภาพสูงนั้นง่ายและรวดเร็ว
ฉันหวังว่าเพื่อนๆ จะสามารถสร้างอัลกอริธึมการเพจข้อมูลแบบเรียลไทม์ที่ดีกว่าได้
หมายเหตุ: เนื่องจากฟอรัมจำกัดอักขระ HTML จึงมีการใช้สัญลักษณ์หลัก ตัวอักษรจีนตัวพิมพ์ใหญ่