2011-05-09 168 views
1

在SQL Server 2005中,我有一个涉及大量ish连接的查询(每个表的数量级从几千行到几百万行,表的平均可能性相当于10-15列的整数和日期时间SQL Server存储过程中间表

为了加快查询速度,我在考虑将一个大查询分解为一个存储过程,该存储过程执行一些连接,存储会导致一些临时表,然后将该临时表与另一个也是几个连接结果的临时表结合在一起。

我目前使用表变量来存储中间表,以及性能o ne off明显更好。但在生产中,tempdb似乎存在IO瓶颈。

有没有更好的方法来思考解决这样的问题?我的意思是,在这里使用表变量的方式?

+1

你能给我们提供关于查询的更多细节吗?我不认为将单个基于集合的查询拆分为多个临时表和查询会使其更快...... – Matthew 2011-05-09 21:53:27

+0

您的执行计划是如何看待的? – 2011-05-09 21:53:49

+0

涉及大约8个连接。执行计划是巨大的各种合并,并寻求和扫描各种表 – 2011-05-09 21:55:20

回答

0

表格变量在TempDB中占用quite a lot of memory

在大型生产环境中,我看到比我为此目的而使用标准表更好的SQL编码器;它们本质上是临时表,但是它们将它们创建为常规表并给它们一个特殊的前缀或后缀。这有额外的好处(如临时表)能够利用索引来帮助执行。

如果您可以使用标准表或利用可由复杂执行的所有步骤访问的临时表,则可以解决内存问题。

认为它是缓存数据的地方。事实上,每次运行主存储过程时,都可以更新这个“缓存”,只要确保使用适当的事务并锁定即可。

想象一下替代方案 - 如果在存储过程中使用巨大的表变量,并且存储过程同时执行10或20次...该表变量可能不再只存在于内存中。