假如要从SQL里得到一笔数据,来自10张以上的表,
A. 一个select 完成join 或left join...这10多张表,得到结果;
B. 两两join到临时表变量,再join下一张表,得到结果.这两种方法,哪种效率更高?
当需要取的数据分布在10多张以上的表,并且其中有些表的数据已经过100万条的时候,用什么办法是最优的呢?听听高手们的意见?

解决方案 »

  1.   

    难说,要看你表的设计和你查询本身的写法你可以分别看看Execution Plan比较一下SQL的查询过程
      

  2.   

    写完查询以后在查询分析器里按下Ctrl+L就可以看到
      

  3.   

    query cost:后面的百分比是啥子意思呢?
      

  4.   

    应该是百分比越大效率越低,但是不能完全按那个来判断主要还是看SQL语句对表操作的次数以及检索的方法
      

  5.   

    理论上, 方法1的效率会高一些, 因为查询优化器会自动寻找优化方案而方法2, 由于是人为决定那些表先join的, 所以在join方面的优化, 不一定切合实际另外, 如果要缓存的数据量很大, 则方法2有大量的磁盘I/O开销, 这也是在理论上, 方法2效率不太好的原因.
      

  6.   

    未必把,你用2的话自己可以控制表的连接顺序,记录少的表先join,最后在搞记录多的表。
      

  7.   

    to: aniude(重返荣耀)但你只能根据当前的记录情况做控制, 不太好预估以后的变化而用方法1的话, sql的优化器可以代替你做这种评估, 所以个人觉得方法1会更好当然, 会join到10几个表的设计本身是不太好的.
      

  8.   

    我觉得方法1好点,毕竟left join 后得到结果集是最小的,并且 sql 优化器会优化你 join的顺序,对以后数据变化能做到动态的适应。
      

  9.   

    我也认为第一种方式好 让SQL自己来判断该怎么Join(Merge/Hash/...) 不过即使这样 性能上也未必怎么样 你做OLAP还是什么的 要联合十个表?表的设计大概不是很好
      

  10.   

    谢谢各位兄台捧场.left join 可是最慢的?这一TAO应用系统, 用于销售流程, 有些报告用到10多个表也不算多?这系统至少有40张表以上.
    sql的硬件环境:3台服务器组,每台配置8G ram+4 cpu我最终用的还是第二种方案,且用的是临时表,没有用表变量.
    远程用户取其中一个报告,一个月整个公司的数据,大约花费4分钟,高峰的时候,低于10分钟.
      

  11.   

    是这样的:这数据库服务器上面有近10个DB,其它DB也是供此应用程序使用的,但数据不是我单位的.我们用的是其中的一个DB,我们的DB的大小近50G,每天增长1G,最大的一张表有200多万笔记录,100多万笔记录.每天上班后,用系统人数至少100人,100人中有输入数据的,也有跑报告的.
      

  12.   

    考虑联结的次序很重要,个人不太清楚SQL优化器的优化效果怎么样?自己可以写不同的Sql运行试试看一下。