数据库迁移中的Web翻页优化实例

数据库迁移中的Web翻页优化实例,第1张

最近忙着把公司的数据库从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读取数据库时实现表格内容翻页的原理是怎么样的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10135594.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存