我有一个表Buy里面有十万条记录,要与其它三个表进行关联。但每次读取Buy这个表时候,只取1000条记录。现在的问题是
A:我是先取出1000条记录后再与其它表进行关联呢,
B:还是先与其它三个表关联后再取1000条记录。下面是我写的测试代码:declare @strSQL1 varchar(1000);
declare @strSQL2 varchar(1000);
declare @strSQL3 varchar(1000);
set @strSQL1='(select top 1000 old.ID,old.title,old.type,old.SmallClassID,old.shi,old.qu from old  order by where old.SmallClassID=68 RegDate desc,id desc) as old'
set @strSQL2='SELECT old.ID,old.Title,old.Type,old.SmallClassID,shi.shi,qu.qu FROM ('+@strSQL1+' INNER JOIN shi ON old.shi=shi.id ) INNER JOIN SmallClass1 on old.SmallClassID=SmallClass1.id INNER JOIN qu ON old.qu=qu.id;'set @strSQL3='SELECT top 1000 old.ID,old.Title,old.Type,old.SmallClassID,shi.shi,qu.qu FROM (((old INNER JOIN shi ON old.shi=shi.ID) INNER JOIN SmallClass1 on old.SmallClassID=SmallClass1.ID) INNER JOIN qu ON old.qu=qu.id) where old.SmallClassID=68 Order by old.RegDate Desc,old.ID Desc;'execute(@strSQL2)/*方法A*/
execute(@strSQL3)/*方法B*/我在sql查询分析器里面测试的时候,不稳定,有时候A的执行时间快,有的时候又慢了.主要是指CPU的执行时间。我想着应该是A的效率会更高一些,但又测试不出来,请教各位高手给指点一下。

解决方案 »

  1.   

    速度肯定是第一个快,可是这两种写法要达到的目的是不同的,一个是第一个表的1000条数据去JOIN,结果可能小于1000条,第2种是JOIN之后再取1000条,除非他JOIN下来就已经小于1000条,不然取出来肯定就1000条!要达到的目的不一样的!
      

  2.   

    A和B在查询分析器里执行好像差不多吧,你可以用分析功能分析下
    如果逻辑上面允许,你可以尝试将inner join 换成 left outer join,会快很多
      

  3.   

    Buy表进行关联的字段shi,SmallClassID,qu,在表shi ,qu ,SmallClass1里面是肯定能找到的得,而且只会有一条。
    我想达到的目的应该是一样的。4楼的朋友,换成这个left Outer join要快一些,能说明一下原因吗?sql知识欠缺,多谢了
      

  4.   

    先取数据再用INNER JOIN 或者LEFT JOIN 连接,快许多,可以试试~~~
      

  5.   

    left join 不用过滤数据,left join 左边的表有多少就出多少记录,只是相应有对应的才有结果少了一大步过滤步骤,时间当然少了萨当然这是针对你这种情况来说的理论上,a方法好,不过我记得那本书说过,sql2005会自动执行a计划,尽管你用的b语句。尽量用a语句写
      

  6.   

    一样的,SQL的执行逻辑是先执行筛选条件再进行关联,可参考《inside sql server 2005 - t-sql querying》