foxty [karya asli]
baru-baru ini mempelajari cara menulis algoritma paging tinggi-kecil. Saya telah memilahnya dan idenya adalah sebagai berikut:
Pertama, perlu ada kolom penomoran otomatis (ID) di database. Kemudian pada kunjungan pertama, keluarkan semua catatan, sesuaikan jumlah catatan pada setiap halaman PageSize, hitung jumlah halaman, lalu buat array satu dimensi PageId (PageCount) berdasarkan jumlah halaman ) menyimpan kondisi pengujian awal rekaman, dan kemudian Sesuai dengan setiap elemen, simpan kode batas ID yang sesuai dengan setiap halaman (
1. Kode batas ID: Jika urutan rekaman ID rekaman database adalah sebagai berikut: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
Dengan asumsi Anda perlu mengurutkan berdasarkan ID, PageSize = 5, Pagecount = 4, PageId(4)
Nilai dari array PageId adalah PageId(0) = 1, PageId(1) = 5, PageId(2) = 10, PageId(3) = 15, PageId(4) = 16
Saat mengakses halaman ke-i, langsung cari rekaman antara [PageId(i-1), PageId(i)).
Misalkan Anda perlu mengurutkan berdasarkan ID dalam urutan terbalik,
Nilai dari array PageId adalah PageId(0) = 16, PageId(1) = 12, PageId(2) = 7, PageId(3) = 2, PageId(4) = 1. Saat mengakses ke-i halaman, langsung Temukan ID milik [ PageId(i-1) , PageId(i) )
)
Simpan array PageId() di Application() untuk kemudahan akses, sehingga Application() hanya diinisialisasi saat pager pertama kali diakses. Bagian kodenya sebagai berikut: (selanjutnya disebut program baru)
<%
Waktu1 = Pengatur Waktu()
Sambungan Redup
Setel Sambungan = Server.CreateObject("Adodb.Connection")
Sambungan terbuka "Driver={MicroSoft Access Driver (*.mdb)};Dbq="&Server.MapPath("db.mdb")
'www.downcodes.com
Redupkan Halaman,PageCounts,PageId,PageList
Redupkan Rs,Sql
Redupkan Init,i
IsInit = False 'Bendera ini digunakan untuk menentukan apakah Aplikasi ("PageId") diinisialisasi
PageList = 20 'Tetapkan 20 buah data untuk ditampilkan pada setiap halaman
Setel Rs = Server.CreateObject("Adodb.Recordset")
Page = Request.QueryString("Page") 'Perhatikan bahwa nomor halaman perlu diperiksa jenisnya
Jika IsEmpty(Application("PageId")) Kemudian 'Jika Application("PageId") belum diinisialisasi, inisialisasi terlebih dahulu
Response.Write("Init aplikasi!<br>")
Sql = "Pilih * Dari Tes Urutan Berdasarkan Id Desc" 'Asumsikan ini diurutkan dalam urutan terbalik berdasarkan ID
Rs.open Sql,Conn,1,1 'Dapatkan objek kumpulan data
Jika Tidak (Rs.Eof atau Rs.Bof) Kemudian
Rs.PageSize = PageList 'Tetapkan jumlah record per halaman
Jumlah Halaman = Rs. Jumlah Halaman
ReDim PageId(PageCounts) 'Definisikan ulang array PageId
Untuk i = 0 Ke PageCounts 'Mulai berikan nilai ke array PageId()
Jika Rs.eof Lalu Keluar Untuk
PageId(i) = Rs("ID")
Rs.Move(Daftar Halaman)
Berikutnya
Rs.MoveLast
PageId(PageCounts) = Rs("ID")
Aplikasi.Kunci()
Aplikasi("IdHalaman") = IdHalaman
Aplikasi.Buka Kunci()
Akhiri Jika
Rs.Tutup
Akhiri Jika
IdStart = Clng(Aplikasi("PageId")(Halaman-1))
IdEnd = Clng(Aplikasi("PageId")(Halaman))
Sql = "Pilih * dari pengujian di mana id<="&IdStart&" dan id>"&IdEnd&" "
Rs.open Sql, Conn,1,1
Meskipun Bukan Rs.eof
Respon.Tulis(rs(0)&"--"&rs(1))
Rs.MoveNext
Pergi ke
Rs.Tutup
Tetapkan Rs = Tidak Ada
Sambungan Tutup
SetConn=Tidak ada
Untuk i = 1 Ke Ubound(Application("PageId"))
Respon.Write("<a href='Test1.asp?Page="&i&"'>"&i&"</a> ")
Berikutnya
Waktu2 = Pengatur Waktu()
Respon.Tulis("<br>"&(Waktu2-Waktu1)*1000)
'Aplikasi.Isi.Hapus("IdHalaman")
%>
Kode paging tradisional adalah sebagai berikut: (selanjutnya disebut program lama)
<%
Waktu1 = Pengatur Waktu()
Sambungan Redup
Setel Sambungan = Server.CreateObject("Adodb.Connection")
Sambungan terbuka "Driver={MicroSoft Access Driver (*.mdb)};Dbq="&Server.MapPath("db.mdb")
Redupkan Halaman, Jumlah Halaman, Daftar Halaman
Redupkan Rs,Sql
Daftar Halaman = 20
Halaman = Permintaan.QueryString( "Halaman" )
Setel Rs = Server.CreateObject("Adodb.Recordset")
Sql = "Pilih * dari pesanan pengujian berdasarkan id desc"
Rs.Open Sql, Conn,1,1
Jika Halaman = "" Maka Halaman = 1
Jika Tidak (Rs.eof Atau Rs.Bof ) Kemudian
Rs.PageSize = Daftar Halaman
Jumlah Halaman = Rs. Jumlah Halaman
Rs.AbsolutePage = Halaman
Akhiri Jika
Untuk i = 1 sampai PageList
Jika Rs.eof Lalu Keluar Untuk
Respon.Tulis(Rs(0)&"-----"&Rs(1)&"<br>")
Rs.MoveNext
Berikutnya
Untuk i = 1 Ke Jumlah Halaman
Respon.Write("<a href='Test.asp?Page="&i&"'>"&i&"</a> ")
Berikutnya
Waktu2 = Pengatur Waktu()
Respon.Tulis("<br>"&(Waktu2-Waktu1)*1000)
%>
Faktanya, ide keseluruhannya adalah membuat array global Application("PageId"), dan setiap elemen menyimpan rentang ID rekaman di halaman. Misalnya, Application("PageId")(0) menyimpan ID elemen pertama. Kemudian Application("PageId")(1) menyimpan ID pertama dari halaman berikutnya...dan seterusnya. Saat Anda perlu mengakses halaman ke-i, cari saja ID tersebut langsung di [Application( "PageId")(i- 1) , Application("i") ) Dengan cara ini, Anda hanya perlu mencari jumlah catatan yang diperlukan setiap kali, daripada mencari semua catatan setiap saat. Namun, metode ini digunakan akses pertama Ketika array Application("PageId") perlu dibuat, ini sedikit lebih lambat. Saat diakses untuk ke-N kalinya (N>1), kecepatannya hampir 10 kali lebih cepat tes:
1. Ada 32.000 catatan dalam database. Program lama membutuhkan waktu sekitar 500 milidetik untuk mengakses satu halaman. Program baru hanya mencapai waktu ini pada akses pertama, dan kemudian hanya membutuhkan waktu sekitar 55 milidetik setiap kali.
2. Tingkatkan data menjadi 64.000 catatan. Program lama membutuhkan waktu sekitar 1.000 milidetik untuk mengakses satu halaman. Program baru juga mencapai tingkat ini saat pertama kali mengaksesnya. Masih tetap sekitar 55 milidetik setelahnya.
3. Meningkatkan data menjadi 128.000 record. Program lama membutuhkan waktu sekitar 1900 milidetik untuk mengakses satu halaman, program baru membutuhkan waktu sekitar 2300 milidetik untuk mengakses satu halaman untuk pertama kalinya, dan selanjutnya setiap akses hanya membutuhkan waktu sekitar 70 milidetik.
Yang perlu diperhatikan di sini adalah setiap kali database diubah, Application("PageId") perlu dipindahkan!
Pengalaman penelitian: (Pertama-tama, terima kasih Ye Zi (DVBBS) atas pengalaman Anda) Cobalah untuk tidak menggunakan program paging bawaan, Rs.RecordCount sangat memakan sumber daya. Pada gilirannya, diperkirakan Rs.PageCount... juga menghabiskan sumber daya, dan efek penggunaan Rs.GetRows() juga meningkat secara signifikan.
Setelah dibandingkan, kecepatan dan efisiensi algoritma daun relatif tinggi ketika catatannya relatif tinggi. Tapi tidak terlalu stabil, terkadang (jarang) melonjak dari sekitar 30 md ke 1-200 md. Setelah itu, efisiensinya turun secara signifikan menjadi 50-80 milidetik, dan kemudian efisiensinya menjadi lebih rendah. Efisiensi algoritma baru untuk pertama kalinya relatif rendah, sekitar 500 milidetik, tetapi kemudian relatif stabil. Biasanya sekitar 50 milidetik, dan seiring dengan perubahan jumlah catatan di perpustakaan, kecepatan ini tetap sama. Tidak ada yang akan berubah. Lain kali saya akan mencoba menggabungkan Ye Ye dengan algoritma saya, tetapi algoritma Ye Ye memang sangat bagus dan serbaguna. Saya hanya bisa menggunakannya untuk ngobrol.