分析 函数??

fuyou001 2009-05-11 06:02:18
sql1

select MAIN_DOMAIN, ALEXA_RANKING, site_name, SITE_TYPE, CONTACT
from (select MAIN_DOMAIN,
ALEXA_RANKING,
site_name,
SITE_TYPE,
CONTACT,
spare_num,
row_number() over(partition by MAIN_DOMAIN order by MAIN_DOMAIN) rn
from site_alexa)
where rn = 1
and spare_num = 0
and ALEXA_RANKING >= '0'
and ALEXA_RANKING <= '1000000'
order by ALEXA_RANKING desc


sql2


select distinct MAIN_DOMAIN, ALEXA_RANKING, site_name, SITE_TYPE, CONTACT
from site_alexa
where 1 = 1
and spare_num = 0
and ALEXA_RANKING >= '0'
and ALEXA_RANKING <= '1000000'
order by ALEXA_RANKING desc


总记录:526130
索引:
DOMAIN 域名
MAIN_DOMAIN 主域名
我一直以为分析函数 row_number()会比distinct快,但这一两个sql ,distinct更快1秒多
sql1 要3秒多,sql21秒多
...全文
255 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
oraclelogan 2009-05-14
  • 打赏
  • 举报
回复
我觉得有可能是慢在这里2个查询条件:

and ALEXA_RANKING >= '0'
and ALEXA_RANKING <= '1000000'


字符串的<= >=是很费时间的,楼主这里为什么不转换成数字呢?
fuyou001 2009-05-13
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080919/13/7809f349-9396-4857-bcb8-f5140bce3e9d.html
找到个例子
但没找到用法
我自己这下试的,不成功!
选执行这语句:

begin
dbms_stats.gather_table_stats(ownname => kailiao,
tabname => 'spd_domain',
method_opt => 'for all indexed columns',
cascade => TRUE);
end;



再执行:
select MAIN_DOMAIN, ALEXA_RANKING, site_name, SITE_TYPE, CONTACT
from (select MAIN_DOMAIN,
ALEXA_RANKING,
site_name,
SITE_TYPE,
CONTACT,
spare_num,
row_number() over(partition by MAIN_DOMAIN order by MAIN_DOMAIN) rn
from site_alexa)
where rn = 1
and spare_num = 0
and ALEXA_RANKING >= '0'
and ALEXA_RANKING <= '1000000'
order by ALEXA_RANKING desc


最后执行:
SELECT endpoint_number, endpoint_value, ENDPOINT_ACTUAL_VALUE
FROM (SELECT endpoint_number, endpoint_value, ENDPOINT_ACTUAL_VALUE
FROM USER_HISTOGRAMS
WHERE table_name = 'spd_domain'
and column_name = 'kailiao'
ORDER BY endpoint_number)
WHERE rownum <= 20;

但查询出来的结果没有记录

我想查上面的查询sql语句 的统计信息, 各位 前辈要怎么用
whqcfp 2009-05-13
  • 打赏
  • 举报
回复
顶。。。。。。。。。
fuyou001 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 liuyi8903 的回复:]
没有统计信息?收集一下统计信息.
[/Quote]的版本是9i2的,
怎么收集统计信息,能给个deom吗
liuyi8903 2009-05-12
  • 打赏
  • 举报
回复
dbms_stats.gather_table_stats....
inthirties 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 liuyi8903 的回复:]
没有统计信息?收集一下统计信息.
[/Quote]

是的,再加上这点,没有统计信息,也就基于Rule叻
liuyi8903 2009-05-11
  • 打赏
  • 举报
回复
没有统计信息?收集一下统计信息.
inthirties 2009-05-11
  • 打赏
  • 举报
回复
是oracle9i或者以上版本么

如果是的可以设置system的parameter optimizer_mode=CHOOSE 或者是 ALL_ROWS/First_ROWS

或者是在查询语句里加上hint select /*+ FIRST_ROWS */ * from .....
friendjin 2009-05-11
  • 打赏
  • 举报
回复
1.请提供数据库版本, SGA和PGA相关配置,其实DISTINCT和ROW_NUMBER没一个是好东西,但若字段太多的话,建议使用row_number,在oracle 9i(或以前),oracle distinct 使用sort unique操作,而在oracle 10g,在采用group by hash操作,不需要全派序的,效率要高很多
2.大家讨论来讨论去,不知道注意到没有,这两条sql并不等价,那么执行快慢讨论还有什么意义呢
wffffc 2009-05-11
  • 打赏
  • 举报
回复
Optimizer不一样看看
Angly1018 2009-05-11
  • 打赏
  • 举报
回复
学习
怎么用sql语句查share_pool的sql?
fuyou001 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wffffc 的回复:]
引用 8 楼 inthirties 的回复:
使用choose的优化模式

两个不一样,不是一个数据库?
[/Quote]
是同一表空间,同一表
wffffc 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 inthirties 的回复:]
使用choose的优化模式
[/Quote]
两个不一样,不是一个数据库?
goodlucktomyself 2009-05-11
  • 打赏
  • 举报
回复
路过,学习下....
inthirties 2009-05-11
  • 打赏
  • 举报
回复
使用choose的优化模式
pathuang68 2009-05-11
  • 打赏
  • 举报
回复
xiaoxiao1984 2009-05-11
  • 打赏
  • 举报
回复
呵呵,执行完sql1的时候,楼主清除了缓存的data block了么
alter system flush buffer_cache;
alter system flush shared_pool;

清除缓存之后再执行sql2统计看看

mantisXF 2009-05-11
  • 打赏
  • 举报
回复
-- 有时分析函数用法不一定比其他的一般用法速度快,要看具体的情况。像上面的例子SQL1中多了个ORDER BY操作。
[Quote=引用楼主 fuyou001 的帖子:]
sql1

SQL code
select MAIN_DOMAIN, ALEXA_RANKING, site_name, SITE_TYPE, CONTACT
from (select MAIN_DOMAIN,
ALEXA_RANKING,
site_name,
SITE_TYPE,
CONTACT,
spare_num,
row_number() over(partition by MAIN_DOMAIN order by MAIN_DOMAIN) rn
from site_alexa)
where rn = 1
and spare_num = 0

[/Quote]
fuyou001 2009-05-11
  • 打赏
  • 举报
回复
sql2 rule执行计划:

SELECT STATEMENT, GOAL = RULE Optimizer=RULE
SORT UNIQUE
TABLE ACCESS FULL

fuyou001 2009-05-11
  • 打赏
  • 举报
回复
sql1执行计划:

SELECT STATEMENT, GOAL = RULE Optimizer=RULE
SORT ORDER BY
WINDOW NOSORT
VIEW
WINDOW SORT PUSHED RANK
TABLE ACCESS FULL



sql2执行计划


SELECT STATEMENT, GOAL = CHOOSE				Optimizer=CHOOSE		
SORT UNIQUE
TABLE ACCESS FULL
加载更多回复(2)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧