oracle 百万级数据 order by 查询过慢

伯恩大帝哈狄斯 2014-05-29 10:56:06
百万级数据,一下不管哪种情况都很慢
1.order by 之后查询太慢了
2.通过时间查询之后count也很慢
3.多表联合查询,之后排序(非索引项)或者count也慢

注:有主键

请牛人不吝赐教,怎么优化才能提高效率
...全文
3412 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuyeyi 2014-06-05
  • 打赏
  • 举报
回复
第一:时间上建立索引, 第二:改成to_date
yyfhz 2014-06-03
  • 打赏
  • 举报
回复
select count(1) abc from (select * from T_BLOG_ARTICLE t where to_char(t.upload_time,'YYYY-MM-DD')>='2010-12-12' and to_char(t.upload_time,'YYYY-MM-DD')<='2014-10-10' order by article_id) ; =========================== 尽量不要用虚表,除非虚表中的记录量和主表记录量相比可以忽略不计。 然后,去掉Order By语句后,速度有明显提升吗?如果没有,那就不是Order By的问题
yuanyannan123 2014-06-03
  • 打赏
  • 举报
回复
强烈建议 大数据不要排序 可以在前台处理排序问题 ,可以通过执行计划去解析你的sql,,看看费时的sql段,逐步优化
tomshenhao 2014-06-03
  • 打赏
  • 举报
回复
LZ针对相关表做个统计,然后给出执行计划.然后根据执行计划来做优化.
良言 2014-06-02
  • 打赏
  • 举报
回复
楼上的各位大神应该都已经说到点了 1.不在字段上用函数,建立日期字段索引 2.count时order by应该去掉 3. *改成article_id,不用回表
引用 10 楼 zhk383501372 的回复:
select * from T_BLOG_ARTICLE 裏面 * 改成 article_id。以前在informix 亿级资料库里测的
huangdh12 2014-05-30
  • 打赏
  • 举报
回复
我怎么看这个语句的 order by 对结果都是没用的啊? 如果是先要取总量,后面再分页的话,可不可以 不用order by的时候查询出总量,然后再根据分页条件进行查询 ,指定开始与结束
  • 打赏
  • 举报
回复
各位大虾么,我重申一下我的需求 1.order by 之后查询太慢了 2.通过时间查询之后count也很慢 3.多表联合查询,之后排序(非索引项)或者count也慢 有一个主键,userid索引 以上都是我项目的实际需求,希望大家帮帮忙,谢谢了
小灰狼W 2014-05-29
  • 打赏
  • 举报
回复
引用 3 楼 lamb218 的回复:
你条件有问题,不要用to_char,改正这样试试: select count(1) abc from (select * from T_BLOG_ARTICLE t where t.upload_time>=to_date('2010-12-12' ,'yyyy-mm-dd') and t.upload_time<=to_date('2014-10-10','yyyy-mm-dd') order by article_id) ; ,对日期建立索引 这样速度会有一个明显的提升
这里t.upload_time<=to_date('2014-10-10','yyyy-mm-dd') 改成t.upload_time<to_date('2014-10-10','yyyy-mm-dd')+1 会更好
lamb218 2014-05-29
  • 打赏
  • 举报
回复
不要对检索条件的列使用任何修饰函数,这样影响性能
lamb218 2014-05-29
  • 打赏
  • 举报
回复
你条件有问题,不要用to_char,改正这样试试: select count(1) abc from (select * from T_BLOG_ARTICLE t where t.upload_time>=to_date('2010-12-12' ,'yyyy-mm-dd') and t.upload_time<=to_date('2014-10-10','yyyy-mm-dd') order by article_id) ; ,对日期建立索引 这样速度会有一个明显的提升
  • 打赏
  • 举报
回复
引用 1 楼 wildwave 的回复:
描述不够精确,应该贴出代码,并对关键字段的类型和值的排列情况进行说明
create table T_BLOG_ARTICLE ( article_id NUMBER not null, user_id NUMBER, article_title VARCHAR2(200), article_content LONG, articletype_id NUMBER, subject_id NUMBER, upload_time DATE, check_flag NUMBER, check_user NUMBER, click_times NUMBER, recommend_flag NUMBER, order_index NUMBER, cover_img VARCHAR2(300), article_role NUMBER ) tablespace JIAOYAN pctfree 10 initrans 1 maxtrans 255 storage ( initial 64 minextents 1 maxextents unlimited ); -- Add comments to the table comment on table T_BLOG_ARTICLE is '博客文章表'; -- Add comments to the columns comment on column T_BLOG_ARTICLE.article_id is '博文id'; comment on column T_BLOG_ARTICLE.user_id is '发布人id'; comment on column T_BLOG_ARTICLE.article_title is '文章标题'; comment on column T_BLOG_ARTICLE.article_content is '文章内容'; comment on column T_BLOG_ARTICLE.articletype_id is '文章分类id'; comment on column T_BLOG_ARTICLE.subject_id is '学科学段id'; comment on column T_BLOG_ARTICLE.upload_time is '上传时间'; comment on column T_BLOG_ARTICLE.check_flag is '0未屏蔽1屏蔽'; comment on column T_BLOG_ARTICLE.check_user is '审核人'; comment on column T_BLOG_ARTICLE.click_times is '点击次数'; comment on column T_BLOG_ARTICLE.recommend_flag is '1推荐0不推荐'; comment on column T_BLOG_ARTICLE.order_index is '排序顺序'; comment on column T_BLOG_ARTICLE.cover_img is '封面图片'; comment on column T_BLOG_ARTICLE.article_role is '显示权限 0所有人 1私有 2好友'; -- Create/Recreate indexes create index USER_ID on T_BLOG_ARTICLE (USER_ID) tablespace TSKPJIAOYAN pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table T_BLOG_ARTICLE add constraint ARTICLE_ID primary key (ARTICLE_ID) using index tablespace TSKPJIAOYAN pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); select count(1) abc from (select * from T_BLOG_ARTICLE t where to_char(t.upload_time,'YYYY-MM-DD')>='2010-12-12' and to_char(t.upload_time,'YYYY-MM-DD')<='2014-10-10' order by article_id) ; 数据时百万级别的
小灰狼W 2014-05-29
  • 打赏
  • 举报
回复
描述不够精确,应该贴出代码,并对关键字段的类型和值的排列情况进行说明
zhk383501372 2014-05-29
  • 打赏
  • 举报
回复
还是你是取出数据量大,在绑定到页面上然后页面加载超级慢?
zhk383501372 2014-05-29
  • 打赏
  • 举报
回复
把你具体的需求搞出来,我以为你说的是要count笔数
  • 打赏
  • 举报
回复
引用 10 楼 zhk383501372 的回复:
select * from T_BLOG_ARTICLE 裏面 * 改成 article_id。以前在informix 亿级资料库里测的
但是我要用表里的各个字段啊
zhk383501372 2014-05-29
  • 打赏
  • 举报
回复
select * from T_BLOG_ARTICLE 裏面 * 改成 article_id。以前在informix 亿级资料库里测的
  • 打赏
  • 举报
回复
没有人遇到过这种情况么?
  • 打赏
  • 举报
回复
引用 7 楼 wildwave 的回复:
贴出执行计划来看下 感觉你给的这个语句给的不是你实际用的语句 在10g的优化器里,这个语句中,order by会被忽略掉,会走日期的索引index fast full scan
是我的语句,因为我要通过时间统计这个时间段的数量
小灰狼W 2014-05-29
  • 打赏
  • 举报
回复
贴出执行计划来看下 感觉你给的这个语句给的不是你实际用的语句 在10g的优化器里,这个语句中,order by会被忽略掉,会走日期的索引index fast full scan
  • 打赏
  • 举报
回复
引用 5 楼 wildwave 的回复:
[quote=引用 3 楼 lamb218 的回复:] 你条件有问题,不要用to_char,改正这样试试: select count(1) abc from (select * from T_BLOG_ARTICLE t where t.upload_time>=to_date('2010-12-12' ,'yyyy-mm-dd') and t.upload_time<=to_date('2014-10-10','yyyy-mm-dd') order by article_id) ; ,对日期建立索引 这样速度会有一个明显的提升
这里t.upload_time<=to_date('2014-10-10','yyyy-mm-dd') 改成t.upload_time<to_date('2014-10-10','yyyy-mm-dd')+1 会更好[/quote] 这个方法我已经试过了

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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