有个问题请教大家,13张表,结构是一个字段,三笔数据,象这样: table1(a char) ... table13(a char),数据是 0 ,1, 3,现在用交叉记录集的方式来开打13张表,会产生1594323笔记录,也就是3*3*3*3*3*3*3*3*3*3*3*3*3=1594323 ,在MSSQL 平均是40秒左右,如果排序则需要1.20'分钟,怎么优化? 选出的方式是 select * from table1,table2.....table13将近160万笔记录,大概是20兆的样子,我做了个试验,如果我把这13张表的数据全部都保存到一个物理表中,并建立一个种子字段,加上索引+排序,再列出也需要1.06'分钟 

解决方案 »

  1.   

    你这种情况很少见呀,给你提提建议吧:
    你可以为每个表建立一个 Index ,然后按 Index 里的字段来关联查询,那样会快很多的,但是会影响到 Update & Insert 的速度。
      

  2.   

    每个表只有一个字段,不担心它是否影响update/insert的速度,只是它很慢,怎么办
      

  3.   

    <<数据是 0 ,1, 3
    这句不太理解,什么意思?缺省情况下建立的索引是非群集索引,如果数据有大量的重复值,应建立群集索引还有就是能不能贴出你的完整的sql语句,连接的内外层表,可能对速度也有一定的要求
      

  4.   

    create table1(a char not null)
    ...
    create table13(a char not null)insert into table1(a)values('0')
    insert into table1(a)values('1')
    insert into table1(a)values('3')
    ....
    insert into table13(a)values('0')
    insert into table13(a)values('1')
    insert into table13(a)values('3')
    select * from Table1,table2,.....table13
      

  5.   

    能否这样来弄,不改动现有结构的基础上写多个视图,是否能提高性能呢?
    例如
    view_12 = select * from table1,table2
    view_34 = select * from table3,table4
    ...
    最后用select * from view_12,view_34,...之类的来得到结果,
    这样如果可能,可以节约大概一半的时间
    建议而已,请楼主试试
      

  6.   

    问题解决了,具体看sql ,最多不超过18秒--这里是建立z1...z13个表
    select * Into z13 from(
    select '0' as a
    union all
    select '1' as a
    union all
    select '3' as a
    ) as z--第一次查询,写到kk1
    select z1.a +z2.a +z3.a+z4.a+z5.a+z6.a as aa
    into kk1
    from z1,z2,z3,z4,z5,z6
    order by aa
    --第二次查询写到kk2
    select z7.a +z8.a +z9.a+z10.a+z11.a+z12.a as aa
    into kk2
    from z7,z8,z9,z10,z11,z12
    order by aa
    --第三次查询得到结果
    select z13.a+kk1.aa+kk2.aa from z13,kk1,kk2
    欢迎继续讨论;
      

  7.   

    S.F.(CSDN:896410000) 正确寫法,贊同!通用技巧!
      

  8.   

    如果不需要排序的话,可以通过不平衡的交叉连接表的方式提高一下查询的效率
    drop table kk1;
    go
     
    drop table kk2;
    goselect table1.a +table2.a +table3.a+table4.a+table5.a+table6.a as aa
    into kk1
    from table1,table2,table3,table4,table5,table6
    order by aa;
    goselect table7.a +table8.a +table9.a+table10.a+table11.a+table12.a+table13.a as aa
    into kk2
    from table7,table8,table9,table10,table11,table12,table13
    order by aa;
    goselect kk1.aa+kk2.aa from kk1,kk2;
    go
    我这样快了两秒左右,等待大家的发言:-)
    主要是找到一个平衡点,应该有类似的公式吧?
      

  9.   

    select * from table1,table2.....table13select z13.a+kk1.aa+kk2.aa from z13,kk1,kk2这两个得到的结果不一样,SQL内部要做的处理也不一样,所以不能做比较
      

  10.   

    --楼主有时间的话,可以测试一下下面的两个查询语句
    --这两个查询本来就是不同的作用,所以不能比较它们的效率--测试数据
    create table tb(a nchar)
    insert tb select '0'
    union all select '1'
    union all select '3'
    go--查询1
    select a=a.a+b.a+c.a+d.a+e.a+f.a
    +g.a+h.a+i.a+j.a+k.a+l.a
    +m.a
    into tt
    from tb a,tb b,tb c,tb d,tb e,tb f
    ,tb g,tb h,tb i,tb j,tb k,tb l
    ,tb m--查询2
    select a1=a.a,a2=b.a,a3=c.a,a4=d.a,a5=e.a,a6=f.a
    ,a7=g.a,a8=h.a,a9=i.a,a10=j.a,a11=k.a,a12=l.a
    ,a13=m.a
    from tb a,tb b,tb c,tb d,tb e,tb f
    ,tb g,tb h,tb i,tb j,tb k,tb l
    ,tb m
      

  11.   

    --查询1
    select a=a.a+b.a+c.a+d.a+e.a+f.a
    +g.a+h.a+i.a+j.a+k.a+l.a
    +m.a
    --into tt  -----------------------这里我测试的时候加上的,忘记去掉了
    from tb a,tb b,tb c,tb d,tb e,tb f
    ,tb g,tb h,tb i,tb j,tb k,tb l
    ,tb m
      

  12.   

    --楼主再试试,用下面这个语句生成tt表
    select a=a.a+b.a+c.a+d.a+e.a+f.a
    +g.a+h.a+i.a+j.a+k.a+l.a
    +m.a
    into tt
    from tb a,tb b,tb c,tb d,tb e,tb f
    ,tb g,tb h,tb i,tb j,tb k,tb l
    ,tb m
    --再查询一下tt表(列数与数据存储结构不一样,效率是不一样的,我的电脑上是18秒)
    select * from tt
      

  13.   

    邹老大难得来一次Delphi啊。呵呵。