
最近忙着把公司的数据库从mysql迁移到oracle 期间作了很多工作来优化oracle平台的性能 不过这里面最大的性能调整还是来自sql 下面举一个web翻页sql调整的例子 环境 Linux version custom (root@web ) (gcc version (Red Hat Linux )) # SMP Thu Jun : : CST Mem: Swap: CPU:两个超线程的Intel(R) Xeon(TM) CPU GHz优化前语句在mysql里面查询 秒左右出来 转移到oracle后进行在不调整索引和语句的情况下执行时间大概是 秒 调整后执行时间小于 秒 翻页语句 SELECT FROM (SELECT T rownum as linenum FROM (SELECT /+ index(a ind_old)/a category FROM auction_auctions a WHERE a category = AND a closed= AND ends > sysdate AND (a approve_status>= ) ORDER BY a ends) TWHERE rownum < ) WHERE linenum >= 被查询的表 auction_auctions(产品表)表结构 Code: [Copy to clipboard]SQL> desc auction_auctions;Name NullType IDNOT NULL VARCHAR ( )USERNAME VARCHAR ( )TITLE CLOBGMT_MODIFIED NOT NULL DATESTARTSNOT NULL DATEDESCRIPTIONCLOBPICT_URL CLOBCATEGORY NOT NULL VARCHAR ( )MINIMUM_BIDNUMBERRESERVE_PRICE NUMBERBUY_NOWNUMBERAUCTION_TYPE CHAR( )DURATION VARCHAR ( )INCREMENTNUM NOT NULL NUMBERCITY VARCHAR ( )PROV VARCHAR ( )LOCATION VARCHAR ( )LOCATION_ZIP VARCHAR ( )SHIPPING CHAR( )PAYMENTCLOBINTERNATIONAL CHAR( )ENDS NOT NULL DATECURRENT_BIDNUMBERCLOSED CHAR( )PHOTO_UPLOADED CHAR( )QUANTITY NUMBER( )STORY CLOBHAVE_INVOICE NOT NULL NUMBER( )HAVE_GUARANTEENOT NULL NUMBER( )STUFF_STATUS NOT NULL NUMBER( )APPROVE_STATUSNOT NULL NUMBER( )OLD_STARTSNOT NULL DATEZOOVARCHAR ( )PROMOTED_STATUS NOT NULL NUMBER( )REPOST_TYPECHAR( )REPOST_TIMES NOT NULL NUMBER( )SECURE_TRADE_AGREENOT NULL NUMBER( )SECURE_TRADE_TRANSACTION_FEE VARCHAR ( )SECURE_TRADE_ORDINARY_POST_FEE NUMBERSECURE_TRADE_FAST_POST_FEE NUMBER表记录数及大小SQL> select count() from auction_auctions;COUNT() SQL> select segment_name bytes blocks from user_segments where segment_name = AUCTION_AUCTIONS ;SEGMENT_NAME BYTES BLOCKSAUCTION_AUCTIONS 表上原有的索引create index ind_old on auction_auctions(closed approve_status category ends) tablespace tbsindex press ;SQL> select segment_name bytes blocks from user_segments where segment_name = IND_OLD ;SEGMENT_NAME BYTES BLOCKSIND_OLD 表和索引都已经分析过 我们来看一下sql执行的费用SQL> set autotrace trace;SQL> SELECT FROM (SELECT T rownum as linenum FROM (SELECT a FROM auction_auctions a WHERE a category like % AND a closed= AND ends > sysdate AND (a approve_status>= ) ORDER BY a ends) TWHERE rownum < ) WHERE linenum >= ; rows selected Execution Plan SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= ) VIEW (Cost= Card= Bytes= ) COUNT (STOPKEY) VIEW (Cost= Card= Bytes= ) TABLE ACCESS (BY INDEX ROWID) OF AUCTION_AUCTIONS (Cost= Card= Bytes= ) INDEX (RANGE SCAN) OF IND_OLD (NON UNIQUE) (Cost= Card= )Statistics recursive callsdb block getsconsistent getsphysical readsredo sizebytes sent via SQLNet to clientbytes received via SQLNet from clientSQLNet roundtrips to/from clientsorts (memory)sorts (disk)rows processed我们可以看到这条sql语句通过索引范围扫描找到最里面的结果集 然后通过两个view *** 作最后得出数据 其中consistent getsphysical reads我们来看一下这个索引建的到底合不合理 先看下各个查寻列的distinct值select count(distinct ends) from auction_auctions;COUNT(DISTINCTENDS) SQL> select count(distinct category) from auction_auctions;COUNT(DISTINCTCATEGORY) SQL> select count(distinct closed) from auction_auctions;COUNT(DISTINCTCLOSED) SQL> select count(distinct approve_status) from auction_auctions;COUNT(DISTINCTAPPROVE_STATUS) 页索引里列平均存储长度SQL> select avg(vsize(ends)) from auction_auctions;AVG(VSIZE(ENDS)) SQL> select avg(vsize(closed)) from auction_auctions;AVG(VSIZE(CLOSED)) SQL> select avg(vsize(category)) from auction_auctions;AVG(VSIZE(CATEGORY)) SQL> select avg(vsize(approve_status)) from auction_auctions;AVG(VSIZE(APPROVE_STATUS)) 我们来估算一下各种组合索引的大小 可以看到closed approve_status category都是相对较低集势的列(重复值较多) 下面我们来大概计算下各种页索引需要的空间column distinct numcolumn lenends category closed approve_status index : (ends closed category approve_status) press en lishixinzhi/Article/program/Oracle/201311/18323
你这段代码是不完整的,给你讲不明白
以下是自己的完整的数据库连接和分页代码(仅供你参考研究):
<%
'建立数据库连接conn
set conn=ServerCreateobject("adodbconnection")
connopen"Provider=MicrosoftJetOLEDB40;"& _
"Data Source=" & ServerMapPath("/data/datamdb")
'/data/datamdb为数据库的路径,这里是连接的access的数据库,如过是SQL或者其它数据库写法就有点不一样了。
'建立一个数据集rs
set rs=serverCreateObject("adodbrecordset")
rsopen "select from news",conn,1,1
rspagesize=25 '设置每页记录条数
if request("page")="" then '如果返回参数为空则设page为1
page=1
else
page=Request("page") '将URL参数page传给page变量
end if
rsabsolutepage=page '将本页设为page设置的页数
for i= 1 to rspagesize
if rseof then '如果没有数据集以及到结束则跳出循环
exit for
end if
responseWrite(rs("newstitle")) '显示新闻标题
rsmovenext
next
%>
</div>
<!--翻页-->
<div style="font-size:12px;">
当前第<%=page%>页,共有<%=rspagecount%>页,共有:<%=rsrecordcount%>条记录<br />
<%if page=1 then%>
首页
<%else%>
<a href="showmoreasppage=<%=1%>">首页</a>
<%end if%>
<%if page=1 then%>
上一页
<%else%>
<a href="showmoreasppage=<%=page-1%>">上一页</a>
<%end if%>
<%if rspagecount<page+1 then%>
下一页
<%else%>
<a href="showmoreasppage=<%=page+1%>">下一页</a>
<%end if%>
<%if rspagecount<page+1 then%>
尾页
<%else%>
<a href="showmoreasppage=<%=rspagecount%>">尾页</a>
<%end if%>
</div>
<%
rsclose '关闭数据集
set rs=nothing
connclose '关闭连接
set conn=nothing
%>
如果不明白就加我吧!
一种很普通的分页效果
--sql 分页 需要有id
--页数是从0页开始,0就是第一页
SELECT TOP 每页显示记录数
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 每页显示记录数页数 id
FROM 表
ORDER BY id))
ORDER BY ID
可以使用Sql语句来分页,(它本身也有一个分页的功能,不过我一般不用!)
Sql语句:select top 10 表名(或需要的列名) from 表名 where ID not in(select top((当前页数-1)10) ID from 表名)
在点击上一页或下一页时从新绑定DataGridView控件的数据源就行了。
以上就是关于数据库迁移中的Web翻页优化实例全部的内容,包括:数据库迁移中的Web翻页优化实例、有没有人可以帮我看一下这段ASP代码是怎样调用数据库和实现翻页功能的,谢谢了、SQL读取数据库时实现表格内容翻页的原理是怎么样的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)