我也来凑个热闹,Oracle下500万记录分页(含思路)
http://211.155.226.126:8090/UploadFile/500W分页录像.rar
没办法。我没网站。只好做个录像了。:)录像时占了不少资源。实际还要快一点。
原理可见《Hibernate分页查询原理解读》,也是泊来品。谁写的我忘记了。google一下吧。
public String getLimitString(String sql) {
StringBuffer pagingSelect = new StringBuffer(100);
pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
pagingSelect.append(sql);
pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");
return pagingSelect.toString();
}
Oracle采用嵌套3层的查询语句结合rownum来实现分页,这在Oracle上是最快的方式,如果只是一层或者两层的查询语句的rownum不能支持order by。
也就是根据这个写的。
实际代码
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
TzhPager1.SelectCommand="select id,age,sex,memo from test";
TzhPager1.ConnectionString="user id=test500;password=test500;data source=db01";
TzhPager1.CurrentPageIndex = 0;
TzhPager1.DataBind();
}
}
就是扔一个任意合法的sql,生成一个新的SQL,再执行。没用存储过程。数据库里的表连索引都没建。:)