google搜索 站内搜索                 软件测试门户 | 软件测试培训 | 文章资料精选 | 软件测试论坛 | 测试解决方案 | 软件测试博客 | 测试招聘求职 
打印

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

比较两个sql语句的性能


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 编辑 ]

TOP

第一种方法比第二种方法更加快速,节省查询时间,而且性能比较优越。

[ 本帖最后由 derekzhang 于 2007-11-20 16:28 编辑 ]

TOP

第一个效率高
子查询会大幅降低效率。。。
卡车司机说:“每个皮球后面肯定跟着一个小孩。”

TOP

第一种方法运行比第二种方法快,子查询要慢,下面是我的测试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

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

有不对的地方请大家指教

TOP

楼上的真厉害

TOP

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


看来你是个数据库高手,你怎么测试出来差值的呀!!

TOP

在语句执行器前后分别用select getdate()获取当前时间,用执行后的时间与执行前的时间相减即可

TOP

用select getdate()这个语句,,,,高。。。

TOP

其实在SQL查询器里面是有官方的测试工具的,可以测试到所有语句的用时,用的资源等等
建议去试试
这样拿出来的数据会更准确
☑80后 ☑未婚 ☑没房 ☑没车 ☑没钱 ☑御宅

TOP

太强了。特别是4楼的。。。

TOP

还是四楼彪悍,佩服,

TOP

谢谢你们的回复,早已解决了

TOP

 
当前时区 GMT+8, 现在时间是 2008-12-5 23:37Copyright(C)上海博为峰软件技术有限公司 2001-2007 电话:021-64471599-8017
当您在访问网站、论坛及博客过程中遇到问题时可发送email:webmaster@51testing.com或发送论坛短信至管理员风在吹