问题1:

如果我年要做一个统计前10名的操作我怕太慢,所以我打算每月统计前1000名然后最后在年底在前1000名里面统计前10名。现在想问问这连个sql是否除了表名,他的sql是一样的是吧?比如伪每月count 1000sql:
insert countTable
{
select count(*),filed1,filed2.... 
from bigTable
where fd1 = xx and fd2 = xx and fd3 = xx 
and 月日期 
rownum <=1000
}然后年的时候就是
伪sql:
select count(*),filed1,filed2.... 
from countTable
where fd1 = xx and fd2 = xx and fd3 = xx 
rownum <=10
这样没问题吧?问题2
如果很多条sql并发执行。效率会不会比只执行1条要低?如果都对一个表做select操作是否会造成锁表等?问题3
where后面的语句需要做什么优化吗?比如顺序?用的是oracle9i ,因为听说好像9i自己有个分析器,会自动调优所以不用管理where后面的顺序。问题4
我的问题1能
利用物化视图做归并的功能。处理。吗?
怎么做啊?

解决方案 »

  1.   

    1. select count(*),filed1,filed2.... 
    from bigTable
    where fd1 = xx and fd2 = xx and fd3 = xx 
    and 月日期 
    rownum <=1000
    这种sql语句执行肯定有问题啊。2. 就取1000条,有什么用呢?没有按照某种规则排序,得来的结果也没什么保障
    [quot]问题2
    如果很多条sql并发执行。效率会不会比只执行1条要低?如果都对一个表做select操作是否会造成锁表等?
    不会造成死锁。没必要用物化视图。直接利用Oracle的rank函数不是挺好的吗?如
    select deptno, sum(sal) as total_sal, rank() over (order by sum(sal) desc) as rank from emp group by deptno
    然后分段合并。
      

  2.   

    1:rownum <=1000 是按伪列随机排序的,因此是存在问题的,需要按照按照固定的字段排序取前1000..,例如改成
    select * from
    (select count(*),filed1,filed2....  
    from bigTable
    where fd1 = xx and fd2 = xx and fd3 = xx  
    and 月日期  
    order by 月日期) 
    where rownum <=1000--排序完再取伪列的前1000
      

  3.   

    问题2
    如果很多条sql并发执行。效率会不会比只执行1条要低?如果都对一个表做select操作是否会造成锁表等?如果单纯SELECT的话说不会对表上锁定,除法你上锁了,例如SELECT  ..... FROM ....FOR UPDATE;
    这个处理不好的话会锁表3:我记得是9I在乎顺序吧,10G会自动,和你的反过来了4:因为你给点是例子,无法知道你运行得到数据量和运行的时间以及复杂度,如果操作复杂并且需要周期长的话建议使用物化视图,但是一般不建议使用物化视图,
      

  4.   

    那 如果很多条sql并发执行。效率会不会比只执行1条要低?
      

  5.   

    有什么问题啊?是一个伪装sql只是意思就是group以后取前1000条而已
      

  6.   

    count(*)后边能跟field,,,,?
    你这伪码也太伪了吧。
      

  7.   

    To 10楼:
    他可能要group by吧To LZ:
    问题1: 是不是你的数据量很大? 不大的话 不需要再做个表了吧当然如果按照你的方法 应该+个order by吧 否则rownum是随机的 没有任何意义问题2: 锁表的话 for update会的 关于效率问题 如果多线程 应该么关系吧问题3:只知道8i中会有条件顺序的关系 9i 还是10g已经不存在了
      

  8.   

    首先你这样做本身就存在问题。你怎么确定每年的前十名都会出现在每个月的前1000名?
    问题2
    如果很多条sql并发执行。效率会不会比只执行1条要低?如果都对一个表做select操作是否会造成锁表等?
    --既然是并发执行了,效率当然要高于单条执行要高啊,要不然Oracle里的并发执行还有什么意思。
    问题3
    --9i中一般情况下可以不用注意表的顺序了,基于成本的优化器会自动选择较小的表作为驱动表。当然有时Oracle也会选错,可以使用/*+ ordered */强制where后第一个表为驱动表。
    问题4
    --建物化视图还不如直接建表了。
      

  9.   

    1、确实有可能前1000名不是前10名~但是一般肯定没问题。
    2、我说的并发执行是说。程序里会并发调用多个sql。我觉得同时在db里执行多个sql效率会比只执行一个低但不知道会不会低很多。
    3、不是说用那个表策动。而是说where语句后面的条件。
      

  10.   

    只给你一条建议,Oracle做优化肯定比你做的好,所以尽量把东西交给Oracle去做.