有个问题请教大家,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'分钟
解决方案 »
- 请教一下 滚动条的问题
- DVD格式文件的扩展名?
- QuickRpt.pas 在哪里去找?
- 谁有delphi 3 的安装文件?你想要多少分给多少
- 请教:如何使现象多个客户端发送消息?(使用Indy组件)
- 关于触发器的一个小问题??
- BusinessSkinForm中控件使用的两个问题。急啊。哪位大侠来帮帮阿。太穷了,请谅解。
- 请教indy9转到indy10的问题
- 请问如何实现数据库中的首记录的字段自动付值为零 , 请问如何才能够在主、从表上各自添加记录呢。
- Delpih中处理字符串中单引号的问题。
- 我的程序做完了,现在该做报表了,请问该用那一中标表控件,报表比较复杂:qreport/rave/还是其他控件,请有经验的谈一下。
- 如何转换这个字符串.
你可以为每个表建立一个 Index ,然后按 Index 里的字段来关联查询,那样会快很多的,但是会影响到 Update & Insert 的速度。
这句不太理解,什么意思?缺省情况下建立的索引是非群集索引,如果数据有大量的重复值,应建立群集索引还有就是能不能贴出你的完整的sql语句,连接的内外层表,可能对速度也有一定的要求
...
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
例如
view_12 = select * from table1,table2
view_34 = select * from table3,table4
...
最后用select * from view_12,view_34,...之类的来得到结果,
这样如果可能,可以节约大概一半的时间
建议而已,请楼主试试
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
欢迎继续讨论;
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
我这样快了两秒左右,等待大家的发言:-)
主要是找到一个平衡点,应该有类似的公式吧?
--这两个查询本来就是不同的作用,所以不能比较它们的效率--测试数据
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
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
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