表变量的子查询问题 客户等着回话 高手帮帮忙~~~~~~~~
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、最后看看你的索引是否合理。
------解决方案--------------------该用临时表试试