日期:2014-05-18  浏览次数:20615 次

表变量的子查询问题 客户等着回话 高手帮帮忙~~~~~~~~
DECLARE
@TempTable1   table(id1   int   NOT   NULL,
                                    id2   int   NOT   NULL,
                                    id3   int   NOT   NULL,
                                    )
INSERT   INTO   @TempTable1   (id1,id2.id3)
SELECT   DISTINCT   Table1Data1,Table1Data2,Table1Data3   FROM   Table1


DECLARE
@TempTable2   table(Code1   int   NOT   NULL,
                                    Code2   int   NOT   NULL,
                                    Code3   int   NOT   NULL,
                                    )

INSERT   INTO   @TempTable2   (Code1,Code2,Code3)
SELECT   DISTINCT   Table2Data1,Table2Data2,Table2Data3   FROM   Table2
LEFT   JOIN   Table3   ON   ...   LEFT   JOIN   Table4   ON   ...   LEFT   JOIN   Table5   ON   ...
WHERE   EXISTS(   SELECT     ShisetsuCode   FROM   @TempTable1   WHERE   id1   =   Table2.Table2Data1)

这里省略了一些ON的内容   大体意思是这样的  
先查询出一个结果     给表变量@TempTable1   然后在生成表变量@TempTable2的时候调用@TempTable1的内容作为IN   或者   EXISTS   的条件,   结果本来只查出了几百条数据,但是执行的过程却达到2分钟,把EXISTS里的内容换成固定的就很快,只需要30多毫秒   比如IN(1,2,3,4)   不知道是什么原因造成的

更奇怪的是   上面的两个表变量的SQL   在项目的实际存储过程中执行起来就是50多毫秒,实际的存储过程只是多了一些其他的操作.   这本来是好事,但是   客户现在发现,当他们的服务器上跑一些其他程序时,这个本来执行正常的存储过程会非常慢,效果很像单独执行上面的代码,重启数据库后,一切又恢复正常了.  

请高手帮着解决一下~~~~~~     麻烦了~




------解决方案--------------------
内存问题,表变量在数据量不大的时候是放在内存的,数据量大的时候放在硬盘,尽量减少服务器的其他程序运行


------解决方案--------------------
建议临时表
然后删除;

------解决方案--------------------
1、最好用临时表,临时表支持foreign key以外的其它约束和索引
表变量只能支持primary key
2、尽量不要用in,exists之类的查询,改用inner join 效率会更好,因为in,exists都可能引起全表扫描.
3、最后看看你的索引是否合理。


------解决方案--------------------
该用临时表试试