1.一张表内有3亿条数据,该表建立全文索引;2.现在我以“张三”关键词去检索该表,我只需要前300条数据(rownum<=300),这样Oracle查够300条就不再往下扫描,速度很快。SQL语句:select * from 表名 contains(text,'张三')>0 where rownum<=300;3.但实际上张三这个关键词有10000条数据,如果我想先按时间排序(倒序)再取前300条,速度就很慢了,因为如果有排序操作,Oracle会10000条结果集都检索出后再排序,然后才去取前300条,成本太高了,
SQL语句:select * from (select * from 表名 where contains(text,'张三')>0 order by 生产时间 desc) where rownum<=300;4.求解决方案提高检索速度。目的是:检索结果取前300条,但要求记录的生产时间最早的排前面。5.一定给分。
SQL语句:select * from (select * from 表名 where contains(text,'张三')>0 order by 生产时间 desc) where rownum<=300;4.求解决方案提高检索速度。目的是:检索结果取前300条,但要求记录的生产时间最早的排前面。5.一定给分。
解决方案 »
- ora-00600错误
- 我现在只有一个应用的两个.dbf数据文件,能恢复数据库吗?
- oracle访问Sql server表问题。。。
- 谁能帮我优化一下这条oracle 的sql语句?
- sqlldr导入问题
- sqlserver2000链接Oracle9.02 表中包含BLOB类型字段,执行SELECT操作出错(不包含BLOB字段)
- 初学:求一日期函数
- 请问我想让SQL Server与Oracle中的指定表的指定字段保持同步,是否可行?应该如何做?
- 把多行sql语句,存储在以.sql为后缀的文本文件里,用Web语言(php,asp ,jsp)一次调用执行所有的sql语句
- oracle编辑时是不是都这么麻烦啊,回退键用不了
- plsql无法连接linux orcle
- 数据库大表更新
with a1 as (select ... from tb_name where name='张三'),
a2 as (select ... from a1 order by date_time desc)
select * from a2 where rownum<=300;
(
partition part01 values less than (to_data('2011-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) tablespace01,
partition part02 values less than (to_data('2012-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) tablespace02
)毕竟你的数据上亿了,多了都会很慢的
如果已经是带stopkey的sort(SORT ORDER BY STOPKEY),基本上就很难再优化了。
假如你的表结构是这样 customers(id,name,dept)
你可以先建一个分区表 customers_t 语句如下:
CREATE TABLE customers_t(
id INT PRIMARY KEY ,
name VARCHAR (20),
dept VARCHAR (10)
)
PARTITION BY LIST (dept)
(
PARTITION dept1 VALUES ('dept2') TABLESPACE xxx,
PARTITION dept2 VALUES ('dept2') TABLESPACE xxx
);
然后执行 insert into customers_t select * from customers;
rename customers to customers_old;
rename customers_t to customers;
查询的时候这样写语句
select * from customers PARTITION (dept1);
上面所有语句用到的dept1 dept2 是dept字段的具体值,注意分区名后面的dept1不用加单引号,分区名规定必须字母开头且不能包含-
2 单独从sql语句上讲,只能这样查询。无更好的办法。
3 能否采用变通的方法?
假设你的业务是只需要前300条记录。在半夜某时间点调用job,将大表的前300条张三放入另一张表a中。而平时的查询是从另一张表中提取数据。
1、先查询结果,放入临时表,速度搜一下
2、10000条数据进行排序,速度搜一下一步变成两步走,速度搜一下。或者
还个一体机吧,曾几何时,一个在普通服务器上跑2三个小时都跑不出来的sql
在一体机上 搜一下 几秒就完事儿了。
(
select /*+ FIRST_ROWS(300) */ a.* from 表名 a
where contains(text,'张三') > 0
order by 生产时间 desc
)
where rownum<=300不知道这样行不行?
select * from (select rid
from (select a.rid, rownum rn
from (select rowid rid
from 表名 tr
order by tr.d_createdate desc nulls last ) a) b) v1,
表名 tr
where v1.rid = tr.rowid