51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4583|回复: 11
打印 上一主题 下一主题

[讨论] 比较两个sql语句的性能

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-11-14 17:19:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create table fruits (
    type varchar(10) not null,
    variety varchar(20) not null,
    primary key(type, variety));

insert into fruits values
('apple', 'gala'),
('apple', 'fuji'),
('apple', 'limbertwig'),
('orange', 'valencia'),
('orange', 'navel'),
('pear', 'bradford'),
('pear', 'bartlett'),
('cherry', 'bing'),
('cherry', 'chelan');

第一种:
select l.type, l.variety, count(*) as num
from fruits as l
left outer join fruits as r
    on l.type = r.type
    and l.variety >= r.variety
group by l.type, l.variety;

第二种:
select l.type,l.variety,(select count(*) from fruits r where  
                        r.type = l.type and r.variety <= l.variety) num
from fruits l

第三种:
oracle的查询语句
select l.type,l.variety,ROW_NUMBER() OVER(PARTITION BY l.type ORDER BY  l.variety) NUM
from fruits l
由于oracle8i标准版不支持分析函数,改写成前面两种语句后,哪个的性能会快点!第二种解法属于查询语句的那种查询?

[ 本帖最后由 Helen_px 于 2007-11-14 17:22 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2007-11-14 17:27:43 | 只看该作者
第一种方法比第二种方法更加快速,节省查询时间,而且性能比较优越。

[ 本帖最后由 derekzhang 于 2007-11-20 16:28 编辑 ]
回复 支持 反对

使用道具 举报

  • TA的每日心情
    慵懒
    2020-8-11 08:18
  • 签到天数: 114 天

    连续签到: 1 天

    [LV.6]测试旅长

    3#
    发表于 2007-11-14 20:56:28 | 只看该作者
    第一个效率高
    子查询会大幅降低效率。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4#
    发表于 2007-11-19 00:02:36 | 只看该作者
    第一种方法运行比第二种方法快,子查询要慢,下面是我的测试sql语句:
    第一种sql语句:
    select getdate()
    declare @i int
    set @i = 1;
    while(@i < 71)
            begin
                    select l.[type], l.variety, count(*) as num
                    from fruits as l
                    left outer join fruits as r
                            on l.[type] = r.[type]
                            and l.variety >= r.variety
                    group by l.[type], l.variety;
                    set @i = @i + 1;
            end
    select getdate()
    执行70次的起始时间和结束时间分别是:2007-11-18 23:36:48.623 和2007-11-18 23:36:49.700,差值为1077ms

    第二种sql语句:
    select getdate()
    declare @j int
    set @j = 1;
    while(@j < 71)
            begin
                    select l.type,l.variety,(select count(*) from fruits r where  
                    r.type = l.type and r.variety <= l.variety) num
                    from fruits l
                    set @j = @j + 1;
            end
    select getdate()
    执行70次的起始时间和结束时间分别是:2007-11-18 23:36:07.140和2007-11-18 23:36:08.263,差值为1123ms

    有时我们发现,会有不同的运行结果,但通过大量的实验,证明子查询会降低效率,总体来说,第一种方法比第二种方法要快

    有不对的地方请大家指教
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5#
    发表于 2007-11-19 14:50:31 | 只看该作者
    楼上的真厉害
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6#
    发表于 2007-11-20 14:07:22 | 只看该作者

    你是用什么工具测试出来差值的

    看来你是个数据库高手,你怎么测试出来差值的呀!!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7#
    发表于 2008-1-12 22:45:21 | 只看该作者
    在语句执行器前后分别用select getdate()获取当前时间,用执行后的时间与执行前的时间相减即可
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8#
    发表于 2008-1-13 00:09:38 | 只看该作者
    用select getdate()这个语句,,,,高。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2008-1-13 14:27:30 | 只看该作者
    其实在SQL查询器里面是有官方的测试工具的,可以测试到所有语句的用时,用的资源等等
    建议去试试
    这样拿出来的数据会更准确
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2008-1-13 20:31:04 | 只看该作者
    太强了。特别是4楼的。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11#
    发表于 2008-1-13 21:56:40 | 只看该作者
    还是四楼彪悍,佩服,
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12#
     楼主| 发表于 2008-9-18 11:34:45 | 只看该作者
    谢谢你们的回复,早已解决了
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-16 14:22 , Processed in 0.079357 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表