1. 使用临时表方法:
stmt = conn.getConn().createStatement();
String strsql = "select *, ids=identity(9) into #tb from tablename"; //表复制速度很快,不影响效率
stmt.execute(strsql);
strsql = "select * from #tb where ids >0 and ids <=12"; //根据传入参数进行计算
rs = stmt.executeQuery(strsql);
需要特别注意的是:临时表需要手工删除,如遇异常也需要删除,否则在本次会话链接销毁之前,该临时表一直存在会影响后面的使用。
使用完成后:
sql.delete(0, sql.length());
sql.append("drop table #listwebtmp ");
stmttmp.execute(sql.toString());
如遇异常:
sql.delete(0, sql.length());
sql.append("drop table #listwebtmp ");
try
{
stmttmp.execute(sql.toString());
}
catch (SQLException ex1)
{
logger.fatal(sql, ex1);
}
以上转自:http://topic.csdn.net/t/20060628/10/4847504.html,目前还不知道这样做有啥问题,基本可行。
2. 在小数据量的情况下如果使用select top,执行效率有问题,并且当数据量达到一定程度的时候会直接报错
java.lang.OutOfMemoryError.但小数据量的情况下可以偷懒使用如下方法
sql.append("select top 20 * from asp_serv_base_info0 where isdn not in(");
for(int i=0; i<300000; i++)
{
sql.append(DBAUtil.getSqlString("11111111112222222222"));
if(i!=299999)sql.append(",");
}
sql.append(")");
stmt = conn.getConn().createStatement();
System.out.println(sql.toString().length());
System.out.println(System.currentTimeMillis());
rs = stmt.executeQuery(sql.toString());
System.out.println(System.currentTimeMillis());
3. 使用存储过程转自:http://www.chmhome.com/technology/database/sybase/20070527/12616.html
本人没有使用过,放在这里以备参考:
create procedure splitpage @qry varchar(16384),@ipage int, @num int as /*@qry SQL语句, @ipage 页数, @num 每页记录条数 */
begin
declare @maxpages int
declare @rcount int
declare @execsql varchar(16384)
if @ipage>=100
select @maxpages=ceiling(count(*)/@num) from test
else
select @maxpages=100000
if @ipage<=@maxpages/2
begin
select @rcount=@ipage*@num
set rowcount @rcount
set @execsql = stuff(@qry,charindex('select',@qry),6,'select sybid=identity(12),')
set @execsql = stuff(@execsql, charindex('from',@execsql),4,'into #temptable1 from')