在SQL Server 2005中,我有一个涉及一堆大型连接的查询(每个表都是几千行到几百万行的顺序,表平均可能相当于10-15整数列和日期时间。
为了使查询更快,我正在考虑将一个大查询拆分为一个存储过程,该存储过程执行一些连接,存储导致一些临时表,然后将该临时表与另一个临时表连接起来也是一些加入的结果。
我目前正在使用表变量来存储中间表,而且一次性能明显更好。但在生产中,tempdb
似乎有一个IO瓶颈。
有没有更好的方法来考虑解决这样的问题?我的意思是,在这里使用表变量离开基地了吗?
答案 0 :(得分:0)
表变量在TempDB中占用quite a lot of memory。
在大型生产环境中,我看到了比我为此目的使用标准表更好的SQL编码器;它们本质上是临时表,但是它们将它们创建为常规表并为它们提供特殊的前缀或后缀。这具有额外的好处(与临时表一样),能够利用索引来帮助执行。
如果您可以使用标准表或使用复杂执行的所有步骤访问的临时表,则可以解决内存问题。
将其视为缓存数据的地方。实际上,每次运行主存储过程时都可以更新此“缓存”,只需确保使用适当的事务和锁定即可。
想象一下另一种选择 - 如果在存储过程中使用巨大的表变量,并且存储过程同时执行10或20次......那个表变量可能不再仅仅存在于内存中。