SQL Server:临时表或联合更好吗?

Jon*_*len 10 sql-server

一般来说,对于组合大量数据,最好使用临时表/临时变量作为临时区域,还是应该坚持使用"UNION ALL"?

假设:

  • 无需进一步处理,结果将直接发送给客户.
  • 客户端等待完整的记录集,因此不需要流式传输结果.

Ada*_*Dev 9

我会坚持UNION ALL.如果不需要进行中间处理,因此需要临时表,那么我就不会使用.

将数据插入临时表(即使它是一个表变量,尽管有神话,但不是纯粹的"内存"结构)将涉及tempdb中的工作(这可能是一个瓶颈).然后只需SELECT*as-is并返回它而不需要任何特殊处理是不必要的,我认为膨胀代码.当你只需要在没有任何特殊处理的情况下返回数据时,临时表方法似乎有点"围绕房屋".如果我认为有理由使用临时表,我会运行一些类似的性能测试来与没有临时表的vs进行比较 - 然后比较统计数据(持续时间,读取,写入,CPU).进行实际的性能测试是尽可能自信的最佳方式,无论您选择哪种方法,都是最好的.特别是因为您不必使用临时表将工作推送到tempdb中 - 即根据您的查询,它可能涉及到tempdb中的工作.

澄清一下,我并不是说一个比另一个更好.与大多数事情一样,这取决于场景.在所描述的场景中,它只是听起来你要添加一个似乎没有添加任何功能值的额外步骤,除了创建稍微复杂/冗长的查询之外,我看不到你获得任何东西.


kev*_*ers 7

我能想到的临时表的一个优点是你可以为它们应用索引.因此,在处理需要尽快恢复结果的大量数据时,这应该会有所帮助.

  • 同意关于可以向临时表添加索引的观点,但如果正在查询以填充临时表的基础表没有(适当的)索引,那么您仍然遇到初始查询的性能问题 - 你只是在操作上添加了另一个步骤(临时表的填充,索引的创建,然后从临时表中返回数据) (4认同)
  • 这不一定是一个优势.如果要插入一个只能从中选择一次的表,则从表中选择的时间将用于在插入表时构建索引.最好只在原始查询中应用订单并选择. (3认同)