oracle9i,数据量目前在10万左右.
如果我直接用:
select * from table_name ;
这个很快,大约1秒就返回数据到界面了.但是,当有条件查询的时候,比如:
select * from table_name where type="xx";就很慢了,要大约1分钟左右才能返回数据.这才加一个条件就这么慢了,如果我加条件那就更慢了.
请教高手有什么优化的手段?
谢谢!
如果我直接用:
select * from table_name ;
这个很快,大约1秒就返回数据到界面了.但是,当有条件查询的时候,比如:
select * from table_name where type="xx";就很慢了,要大约1分钟左右才能返回数据.这才加一个条件就这么慢了,如果我加条件那就更慢了.
请教高手有什么优化的手段?
谢谢!
尽量不要写 select*,写你需要的字段。在查询条件字段上非聚集建立索引,
select * from table_name where type like 'xx%'
oracle9i
数据量为10万条记录表为:
myTable
字段都有:
serialnumber,city,provice,mail,tel,name,age,status,address其中serialnumber是PK,status为状态有5种分别是0,1,2,3,4,5如果纯粹的
select t.serialnumber,t.city,t.provice,t.mail,t.tel,t.name,t.age,t.status,t.address
from myTable t
执行这个语句是很快的,1秒左右就可以提取数据并显示在程序界面上.如果按照status来查询的话,sql语句为
select t.serialnumber,t.city,t.provice,t.mail,t.tel,t.name,t.age,t.status,t.address
from myTable t
where t.status=0
这个就很慢了,大约要40秒才能把数据显示在界面上.
to:apollolb2005 刚刚尝试了,用like 更慢
1. 如果这个查询与其他的表的查询有关系的话,最好先根据条件做表的合并再做查询,那样可以减小查询表的大小;
2. 如果数据还是很多,那么看看能否在where上下功夫,把条件分析一下:比如说select * from table_name where type="xx",看看xx是否在type中有一定的规律,如:xx全是大于1000的数字.则可以对table_name先search 出type大于1000的值,那么现在再用这个表的数据去search"xx";
3. 如果前面两种方法都不适用,那么就得注意数据在往数据库中插入得过程了,首先:在插入之前就应该知道将来会做高频率search或者海量数据search的具体search条件,比如说这里的type = "xx",我们在插入的时候就可以先对数据按一定的顺序插入. 以便将来search能减小search的数据量.总之:大多数据库的查询优化都是那么几点,优化条件,减小查询表,减少查询次数,你从这几个方面考虑下吧.
还有,你给的条件好象不是很足够.不好具体说怎么做.希望对您有帮助.
另外可以将大的表分割成若干个子表
比如按type或者serialnumber将表分割开。
SELECT A.*,rownum as rn FROM (
select t.serialnumber,t.city,t.provice,t.mail,t.tel,t.name,t.age,t.status,t.address
from myTable t
where t.status=0 ) A
where rownum <=20)B
where rn>=1;我是在PL/SQL中执行
select t.serialnumber,t.city,t.provice,t.mail,t.tel,t.name,t.age,t.status,t.address
from myTable t
where t.status=0
看的花费时间.
如果能在PL/SQL中执行花费大约1-2秒,那么在我程序的界面显示也就不至于感觉很慢了.
或者各位兄弟,有其他的oracle快速分页代码吗?
写的时候最好别写成select *
1.貌似Oracle的分页也就是你用的方法比较好了。
2.所以若提高效率,只能从两个方面考虑。
a.采用异步预读处理,在系统相对空闲的时候,用别的线程读出数据到DataSet,画面处理时只从DataSet里取出数据进行显示。
b.分割表,可以做个触发器,当是做查询/更新的时候,根据条件到对应表里去查询/更新。从.net看过来,还是对原来的表进行操作,所以没有什么影响的。
select t.serialnumber,t.city,t.provice,t.mail,t.tel,t.name,t.age,t.status,t.address
from myTable t
where t.status=0
看的花费时间.
如果能在PL/SQL中执行花费大约1-2秒,那么在我程序的界面显示也就不至于感觉很慢了. ================================
pl/sql显示结果是分了页的.当然会很快.它不会把所有的数据全拿出来.
比如,如果是char(5)
select * from table_name where type="x " -->后面是四个空格.
Thread CreateViewThread = new Thread(ThreadBegin);
ThreadStart ThreadBegin = new ThreadStart(CreateView);
public void CreateView()
{
//Sql 脚本语言创建VIEW
}SQl:
Create View StateuIs0
select * from myTable t where t.status=0
Create View StateuIs1
select * from myTable t where t.status=1
....注:CreateViewThread 线程你可以在程序空闲的时候开启,应该不会有什么影响.
PS:
我的目标是 ----> ^_^
谢谢各位兄弟,问题解决了。还是SQL语句的问题。数据库这边的表没有问题,建立的索引也没问题,存储过程也没问题。结果是程序那边调用存储过程时传递过来的SQL语句多加了一个order by xxx 做了一次排序,导致这个了问题。
我尝试过建立索引,使用系统函数instr代替,全文检索,效果都没我想象中那样好。不知道各位兄弟姐妹还有其他的什么方法优化吗?