登陆论坛 找回密码 立刻获得20pp! 地图 帮助
宽带山生活
版主:

  • 主题内容
<< [1] >>  [只看楼主]  [加入关注] 点击:315 回复:31 已被0人关注

主题:关于分页的优化.用max来解决in的问题...

330 0

来自:上海
注册:2003-01-06
发帖:146+2195 
在之前的贴子,曾和版主讨论过分页的优化...

今天再写出一条分页的语句,大家可以测试一下.不敢说是最快的,起码是更好的....

欢迎交流..

以前的语句中有一个not in和一个in
select * from table_name where id not in (select top 100 id from table_name order by id desc) and id in (select top 200 id from table_name order by id desc) order by id desc


考验到in会遍历整张表.所以做以下修改...

select top 10 * from table_name where id>(select max (id) from (select top ((页码-1)*10) id from table_name order by id) as table_temp) order by id



-------------------------------------------------------------------------------------------
摔坏的olympus C730
送给GF的canon A70
只有一个50mm/f1.8头的canon eos 30V
不懂摄影,你懂吗?

发表于:2004-11-16 11:29:25
推荐:牙齿有问题,您找我! ...楼主...

=大灰狼=
348 0

来自:上海
注册:2003-06-16
发帖:71+477 
试用中…………



-------------------------------------------------------------------------------------------
我是狼,空虚的大灰狼&lt;br /&gt;
A~~~~~~~~~~~~~WU~~~~~~~~~~~~~~`

发表于:2004-11-16 16:21:27

阳光小虾
284 0

来自:广西
注册:2002-10-12
发帖:95+1220 
downloading 我一个月前用.net写留言本不知道怎么分页的时候,也是用类似的分页方式。



-------------------------------------------------------------------------------------------
〈梦想〉

发表于:2004-11-16 20:00:42
推荐:畅玩天下贰,精彩玄幻飞行 ...第2楼...

pcd◎g
951 1

来自:上海
注册:2000-10-03
发帖:820+13373 
没用过
dg.currentpage=e.item.pageindex
dgbind
ok



-------------------------------------------------------------------------------------------
ph管理员的无作玷污了我纯洁的心灵
http://pc.pcdog.org

发表于:2004-11-16 20:58:23
推荐:kds红日官网启动啦!!! ...第3楼...

233 0

来自:上海
注册:2002-09-17
发帖:19+465 
我认为用存储过程会比较好些。

如果是。NET的话,dataGrid可以是可以。不过很多地方有约束。

我现在大部分用存储过程和dataset分页。
fill填充。用ViewState来保存数据(当然就是hidden类型的input),至于提交的话,我是直接__dopostback("cbtn_Click","renaski")

数据多的话,我会考虑用dataGrid和存储过程了。

至于楼主,我随便叉一句。

为什么这里用"in"而不用"exists"呢?

我觉得是不是换成exists会比较好些呢
呵呵。
欢迎讨论



-------------------------------------------------------------------------------------------
以上纯属个人意见,仅供参考,如有误人之处请指正!
msn:renaski@hotmail.com

发表于:2004-11-17 23:17:39

233 0

来自:上海
注册:2002-09-17
发帖:19+465 
这里随便给了一段。
我写论坛封装时候用的来做绑定的。
形参我已经替换掉了。
直接是一个
Shared 非静态成员类,然后调用。做分页提交时候用的。


cBtnSubmit.Attributes.Add("onclick", "javascript:__doPostBack('cbtn_Click','renaski')")



-------------------------------------------------------------------------------------------
以上纯属个人意见,仅供参考,如有误人之处请指正!
msn:renaski@hotmail.com

发表于:2004-11-17 23:22:33

阳光小虾
284 0

来自:广西
注册:2002-10-12
发帖:95+1220 
洛林应该是使用ado的分页吧。楼主的意思是使用sql语句实现分页。呵呵。。。



-------------------------------------------------------------------------------------------
〈梦想·天空 UM99.com流行服饰网〉

发表于:2004-11-18 11:37:04

233 0

来自:上海
注册:2002-09-17
发帖:19+465 
恩,恩。
反正说到分页就带了一笔。

SQL分页的话,用存储过程还是比较实惠些。



-------------------------------------------------------------------------------------------
以上纯属个人意见,仅供参考,如有误人之处请指正!
msn:renaski@hotmail.com

发表于:2004-11-18 13:35:10

233 0

来自:上海
注册:2002-09-17
发帖:19+465 
还有啊,听别人说MSDN上有个自定义分页的比较好些。我没有用过。
有那位可以交流一下。



-------------------------------------------------------------------------------------------
以上纯属个人意见,仅供参考,如有误人之处请指正!
msn:renaski@hotmail.com

发表于:2004-11-18 13:37:45
推荐:【车型PK】大众朗逸VS荣威550 ...第8楼...

Sunrise
1402 0

来自:上海
注册:2000-09-29
发帖:98+4437 
洛林, 你不要太狂妄了,你对DataGrid的理解和对分页的理解都还差了远呢。
ViewState不是是想象的那样用的!不相信你可以把2百万条记录放在ViewState里试试看,呵呵~`

不要总是拿自以为“高深”的东西来唬人,最后被唬的往往只是你自己!

你写的那段是什么啊?难道.NET会白痴到要你来帮服务器控件做click?省省吧!

shared也和你说的什么“静态成员类”风马牛不相及!
vb里的shared关键字等同与c#里的static,
vb里解释为:共享成员是由一个类的所有实例共享的属性、过程和字段。一些编程语言将这样的项称为“静态成员”。
c#里解释为:当属性声明包含 static 修饰符时,称该属性为静态属性。

当然,有一点是对的,用exists比用in效率要高。



-------------------------------------------------------------------------------------------
Never lose my way...

发表于:2004-11-18 13:43:59

阳光小虾
284 0

来自:广西
注册:2002-10-12
发帖:95+1220 
有学习到一些东西了。
我不知道什么语句效率高的,好象白痴一样,呵呵。。。
所以经常来这里听课,,,



-------------------------------------------------------------------------------------------
〈梦想·天空〉
UM99.com流行服饰网 http://www.um99.com

发表于:2004-11-18 16:05:46

233 0

来自:上海
注册:2002-09-17
发帖:19+465 
晕,我刚知道我前面说的是高深的东西。哈哈downloading

对dataGrid理解,或者说.net我还是新手。刚刚接触。不好意思。

以下是
我对stateview的理解。
是放在页面的一个<input type="hidden"里面的,并且是用uncoide什么东西转化过的。

对了大S,你说.net在所有的控件里怎么把__dopostback第2个参数用到呢,你不去自己写一个控件,那怎么用呢?

请教了。

其他的就不知道了。



-------------------------------------------------------------------------------------------
以上纯属个人意见,仅供参考,如有误人之处请指正!
msn:renaski@hotmail.com

发表于:2004-11-18 22:59:25

Sunrise
1402 0

来自:上海
注册:2000-09-29
发帖:98+4437 
我不明白你这样做有什么意义?



-------------------------------------------------------------------------------------------
Never lose my way...

发表于:2004-11-19 00:42:29

172 0

来自:上海
注册:2004-05-26
发帖:18+476 
exists和in根本就不大嘎的,表乱搞



-------------------------------------------------------------------------------------------
only you~~~冷伴偶取石经

发表于:2004-11-19 15:28:03

330 0

来自:上海
注册:2003-01-06
发帖:146+2195 
exists 和 in 的执行效率是一样的

很多资料上都显示说,exists要比in的执行效率要高,同时应尽可能的用not exists来代替not in。但事实上,我试验了一下,发现二者无论是前面带不带not,二者之间的执行效率都是一样的。因为涉及子查询,我们试验这次用SQL SERVER自带的pubs数据库。运行前我们可以把SQL SERVER的statistics I/O状态打开。

(1)select title,price from titles where title_id in (select title_id from sales where qty>30)

该句的执行结果为:

表 'sales'。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。

表 'titles'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。



(2)select title,price from titles where exists (select * from sales where sales.title_id=titles.title_id and qty>30)

第二句的执行结果为:

表 'sales'。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。

表 'titles'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。

我们从此可以看到用exists和用in的执行效率是一样的。



-------------------------------------------------------------------------------------------
摔坏的olympus C730
送给GF的canon A70
只有一个50mm/f1.8头的canon eos 30V
不懂摄影,你懂吗?

发表于:2004-11-19 15:36:35

330 0

来自:上海
注册:2003-01-06
发帖:146+2195 
用函数charindex()和前面加通配符%的LIKE执行效率一样

前面,我们谈到,如果在LIKE前面加上通配符%,那么将会引起全表扫描,所以其执行效率是低下的。但有的资料介绍说,用函数charindex()来代替LIKE速度会有大的提升,经我试验,发现这种说明也是错误的:

select gid,title,fariqi,reader from tgongwen where charindex('刑侦支队',reader)>0 and fariqi>'2004-5-5'

用时:7秒,另外:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。

select gid,title,fariqi,reader from tgongwen where reader like '%' + '刑侦支队' + '%' and fariqi>'2004-5-5'

用时:7秒,另外:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次



-------------------------------------------------------------------------------------------
摔坏的olympus C730
送给GF的canon A70
只有一个50mm/f1.8头的canon eos 30V
不懂摄影,你懂吗?

发表于:2004-11-19 15:37:10

330 0

来自:上海
注册:2003-01-06
发帖:146+2195 
union并不绝对比or的执行效率高

我们前面已经谈到了在where子句中使用or会引起全表扫描,一般的,我所见过的资料都是推荐这里用union来代替or。事实证明,这种说法对于大部分都是适用的。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16' or gid>9990000

用时:68秒。扫描计数 1,逻辑读 404008 次,物理读 283 次,预读 392163 次。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

union

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid>9990000

用时:9秒。扫描计数 8,逻辑读 67489 次,物理读 216 次,预读 7499 次。

看来,用union在通常情况下比用or的效率要高的多。

但经过试验,笔者发现如果or两边的查询列是一样的话,那么用union则反倒和用or的执行速度差很多,虽然这里union扫描的是索引,而or扫描的是全表。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16' or fariqi='2004-2-5'

用时:6423毫秒。扫描计数 2,逻辑读 14726 次,物理读 1 次,预读 7176 次。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

union

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-2-5'

用时:11640毫秒。扫描计数 8,逻辑读 14806 次,物理读 108 次,预读 1144 次。



-------------------------------------------------------------------------------------------
摔坏的olympus C730
送给GF的canon A70
只有一个50mm/f1.8头的canon eos 30V
不懂摄影,你懂吗?

发表于:2004-11-19 15:37:29

330 0

来自:上海
注册:2003-01-06
发帖:146+2195 
字段提取要按照“需多少、提多少”的原则,避免“select *”

我们来做一个试验:

select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

用时:4673毫秒

select top 10000 gid,fariqi,title from tgongwen order by gid desc

用时:1376毫秒

select top 10000 gid,fariqi from tgongwen order by gid desc

用时:80毫秒

由此看来,我们每少提取一个字段,数据的提取速度就会有相应的提升。提升的速度还要看您舍弃的字段的大小来判断



-------------------------------------------------------------------------------------------
摔坏的olympus C730
送给GF的canon A70
只有一个50mm/f1.8头的canon eos 30V
不懂摄影,你懂吗?

发表于:2004-11-19 15:37:56

330 0

来自:上海
注册:2003-01-06
发帖:146+2195 
count(*)不比count(字段)慢

某些资料上说:用*会统计所有列,显然要比一个世界的列名效率低。这种说法其实是没有根据的。我们来看:

select count(*) from Tgongwen

用时:1500毫秒

select count(gid) from Tgongwen

用时:1483毫秒

select count(fariqi) from Tgongwen

用时:3140毫秒

select count(title) from Tgongwen

用时:52050毫秒

从以上可以看出,如果用count(*)和用count(主键)的速度是相当的,而count(*)却比其他任何除主键以外的字段汇总速度要快,而且字段越长,汇总的速度就越慢。我想,如果用count(*), SQL SERVER可能会自动查找最小字段来汇总的。当然,如果您直接写count(主键)将会来的更直接些。



-------------------------------------------------------------------------------------------
摔坏的olympus C730
送给GF的canon A70
只有一个50mm/f1.8头的canon eos 30V
不懂摄影,你懂吗?

发表于:2004-11-19 15:39:30
推荐:被戴绿帽,心情极度差 ...第18楼...

330 0

来自:上海
注册:2003-01-06
发帖:146+2195 
以上内容转抄.....不是我写的...



-------------------------------------------------------------------------------------------
摔坏的olympus C730
送给GF的canon A70
只有一个50mm/f1.8头的canon eos 30V
不懂摄影,你懂吗?

发表于:2004-11-19 15:40:03

Sunrise
1402 0

来自:上海
注册:2000-09-29
发帖:98+4437 
不错的内容,加精了!
不过,这只是在SQLSERVER下做的测试,在别的数据库中,是否会有不同呢?



-------------------------------------------------------------------------------------------
Never lose my way...

发表于:2004-11-19 16:42:08
推荐:大家对于幼教有什么看法? ...第20楼...

Sunrise
1402 0

来自:上海
注册:2000-09-29
发帖:98+4437 
对了,补充一点,
exists 和 in 的执行效率是一样的
不等于说
not exists 和 not in 的效率也是一样的

没有尝试过,那位有兴趣可以试试看。



-------------------------------------------------------------------------------------------
Never lose my way...

发表于:2004-11-19 17:06:31

阳光小虾
284 0

来自:广西
注册:2002-10-12
发帖:95+1220 
downloading 终于知道怎么看效率了,呵呵,,,感谢感谢,,,



-------------------------------------------------------------------------------------------
〈梦想·天空〉
UM99.com流行服饰网 http://www.um99.com

发表于:2004-11-19 19:34:26

233 0

来自:上海
注册:2002-09-17
发帖:19+465 
点击查看全图

自己做了一个,看来以前错误的理解了。

呵呵。

还有我用第2个dopostback参数为了使不同的控件都调用同一个参数控件提交而做下判断的效果。

EG:
a控件用JS方法使dataGrid提交
b控件也是。
那就用第2个参数来加以区分。

为此我也做了个小例子。
签于代码长度的缘故
感兴趣的朋友可以和我私下讨论。

PS:我来这里只是想讨论,交流,分享技术,并不是想卖弄什么。
如果觉得不欢迎的话,可以PM与我。



-------------------------------------------------------------------------------------------
以上纯属个人意见,仅供参考,如有误人之处请指正!
msn:renaski@hotmail.com

发表于:2004-11-19 23:40:07

233 0

来自:上海
注册:2002-09-17
发帖:19+465 
本想关机了,在重新登陆一下PCHOME。

自己随便插一句。

我认为写SQL语句的看法。

效率必然是要考虑。

不过最主要是看自己写的SQL语句怎么去便去自己的理解,和其他人的维护才是最主要的。

举个例子。

SELECT a.*, (SELECT cols FROM table1) AS cols_table1 FROM table2


用inner jion做比较。

我觉得我还是比较倾向与前者。不过后来用MSSQL查了一下效率。后者inner jion少了一个环节。

不过用了inner jion的话,自己觉得就很抽象了,所以在我坚持下,最后我还是用了前者写东西。
当然,不排除自身对SQL语句的认识和理解。
还是要看自身怎么去把握了。



-------------------------------------------------------------------------------------------
以上纯属个人意见,仅供参考,如有误人之处请指正!
msn:renaski@hotmail.com

发表于:2004-11-19 23:50:31

上水
720 63

来自:上海
注册:2001-07-02
发帖:136+1162 
.NET会白痴到要你来帮服务器控件做click?

这个很难理解的哦?!downloading



-------------------------------------------------------------------------------------------
JWSMS官方站点:
http://www.joywap.com

发表于:2004-11-20 00:03:53

Jack
918 0

来自:上海
注册:2001-05-06
发帖:198+3386 
  引用:

SELECT a.*, (SELECT cols FROM table1) AS cols_table1 FROM table2



子查询和内连接似乎不是一回事吧?downloading



-------------------------------------------------------------------------------------------
Face it, think over it, and resolve it.
http://jackma.net/
http://v1.jackma.net/

发表于:2004-11-22 09:56:49

233 0

来自:上海
注册:2002-09-17
发帖:19+465 
哦,是吗?

你自己试下就知道了。



-------------------------------------------------------------------------------------------
以上纯属个人意见,仅供参考,如有误人之处请指正!
msn:renaski@hotmail.com

发表于:2004-11-22 11:53:21

Sunrise
1402 0

来自:上海
注册:2000-09-29
发帖:98+4437 
  引用:
所以在我坚持下,最后我还是用了前者写东西。


听上去还很有道理似的



-------------------------------------------------------------------------------------------
Never lose my way...

发表于:2004-11-22 12:20:16

233 0

来自:上海
注册:2002-09-17
发帖:19+465 
有没有道理那是我的事了。

呵呵。

新建==》项目==》windows控件库

大S等于把vs.net这个功能给抹杀了。



-------------------------------------------------------------------------------------------
以上纯属个人意见,仅供参考,如有误人之处请指正!
msn:renaski@hotmail.com

发表于:2004-11-22 20:57:04

Sunrise
1402 0

来自:上海
注册:2000-09-29
发帖:98+4437 
我哪句话把这个功能抹杀了?
搞笑了~`



-------------------------------------------------------------------------------------------
Never lose my way...

发表于:2004-11-22 21:48:01
推荐:迎新年牙齿美容大行动 ...第30楼...

回复主题 [ 返回ASP ]
主题: 关于分页的优化.用max来解决in的问题...
手机看宽带山

关于我们 - 联系我们 - 加入我们 - 营销服务 - 友情链接 - 频道合作- PChome Widget
Copyright © 1996-2009 PChome.net All rights reserved. 电脑之家 版权所有