採用網上常見的分頁方式,在sqlserver事件分析器中觀察,發現
幾個主要的sql查詢中,耗費最大的是查詢所有的記錄數。
將其從分頁程式中剔除,前後的效果進行對照。在30w左右的庫中查詢,大概時間消耗(單位:毫秒)如下:
改進前
第1頁,返回100條記錄,耗時:109.375
第5頁,返回100條記錄,耗時:109.375
第10頁,返回100條記錄,耗時:125
第50頁,返回100條記錄,耗時:125
第100頁,返回100條記錄,耗時:171.875
第500頁,返回100條記錄,耗時:171.875
第1000頁,返回100條記錄,耗時:218.75
第1500頁,返回100條記錄,耗時:234.375
第2000頁,返回100條記錄,耗時:250
第3000頁,返回0條記錄,耗時:187.5
改進後
第1頁,返回100條記錄,耗時:62.5
第5頁,返回100條記錄,耗時:78.125
第10頁,返回100條記錄,耗時:62.5
第50頁,返回100條記錄,耗時:78.125
第100頁,返回100條記錄,耗時:125
第500頁,返回100條記錄,耗時:140.625
第1000頁,返回100條記錄,耗時:156.25
第1500頁,返回100條記錄,耗時:171.875
第2000頁,返回100條記錄,耗時:203.125
第2500頁,返回100條記錄,耗時:250
第3000頁,返回0條記錄,耗時:140.625
第4000頁,返回0條記錄,耗時:156.25
如果sql語句包含了一個對普通欄位的排序操作,將會大大影響效率
第1頁,返回100條記錄,耗時:640.625
第10頁,返回100條記錄,耗時:5500
第50頁,返回100條記錄,耗時:4250
第100頁,返回100條記錄,耗時:4062.5
第500頁,返回100條記錄,耗時:4031.25
第1000頁,返回100條記錄,耗時:5171.875
第1500頁,返回100條記錄,耗時:4015.625
第2000頁,返回100條記錄,耗時:4359.375
第2500頁,返回100條記錄,耗時:4531.25
第3000頁,返回0條記錄,耗時:4203.125
但是,如果對這個普通欄位建立索引後,效率又恢複到可以接受的程度
第1頁,返回100條記錄,耗時:78.125
第10頁,返回100條記錄,耗時:109.375
第50頁,返回100條記錄,耗時:125
第100頁,返回100條記錄,耗時:140.625
第500頁,返回100條記錄,耗時:140.625
第1000頁,返回100條記錄,耗時:171.875
第1500頁,返回100條記錄,耗時:203.125
第2000頁,返回100條記錄,耗時:218.75
第2500頁,返回100條記錄,耗時:250
第3000頁,返回0條記錄,耗時:140.625
在access表中測試,還是30w條記錄,效能降低
第1頁,返回100條記錄,耗時:1937.5
第100頁,返回100條記錄,耗時:1765.625
第1000頁,返回100條記錄,耗時:1921.875
第2000頁,返回100條記錄,耗時:2109.375
一些發現:
- 在大量資料的查詢中,在where子句中使用非索引的欄位,對效能影響不大。但如果在Order by子句中使用了非索引的欄位,將會大大影響效率。