SQL Server在重度连接之前首先将数据放入临时表

时间:2013-06-05 19:08:54

标签: sql-server sql-server-2008

加入几个其他表之前,首先将数据放入临时表是否是一个好主意?

例如,假设我有以下内容:

  • tableA,500万行
  • tableB,500万行
  • tableC,500万行
    ...
  • tableG

我想要执行的查询可能如下所示:

SELECT 1 FROM tableA 
INNER JOIN tableB WITH (NOLOCK) ON tableA.col1= tableB.col1
LEFT JOIN tableC WITH (NOLOCK) ON ...
...
LEFT JOIN tableG WITH (NOLOCK) ON ...
WHERE tableA.someCol= conditionA AND tableB.someCol= conditionB...

假设使用过滤器,将只返回一小部分tableA。在加入其他表之前首先从tableA中提取数据是一个好主意,以便避免阻塞并且可能提高性能

我试过谷歌搜索,但找不到任何满意的答案。提前谢谢。

1 个答案:

答案 0 :(得分:1)

以下是我尝试的“典型”。我经常尝试一下,看看在负载下和在表示生产行号的“大数据”下发生了什么,而不是开发行号。

从记忆中走出来。

  1. 如果是“一次性”使用,我尝试使用派生表方法。
  2. 如果“holder”表中的数据可以重复使用,那么如果行数很小,我会从@variableTable开始。 2.B.我唯一一次看到@variableTable螺丝,如果你做了一些聚合结果......其中“汇总行”只有几个,但为了生成汇总行,你会遇到很多行。想想“从dbo.LargeTableOfData中选择StateAbbreviation,count(*)”......结果表中只有50行左右,但是聚合数据来自一个有很多行的大表。
  3. 然后我去#TempTable。大多数时候没有索引。有时带索引。 我生命中的2到3次#TempTable的指数显着改善。
  4. 这是一款“试玩游戏”。有时你只是不知道,直到你给它大学尝试。

    Use Northwind
    GO
    
    /* Temp Table , No Index(es) */
    
    IF OBJECT_ID('tempdb..#TempTableNoIndex') IS NOT NULL
    begin
            drop table #TempTableNoIndex
    end
    
    
    CREATE TABLE #TempTableNoIndex 
    ( 
        OrderID int
    )
    
    
    Insert into #TempTableNoIndex (OrderID) select top 5 OrderID from dbo.Orders
    
    
    Select * from dbo.[Order Details] od where exists (select null from #TempTableNoIndex innerHolder where innerHolder.OrderID = od.OrderID )
    
    
    
    /* Temp Table , With Index(es) */
    
    IF OBJECT_ID('tempdb..#TempTableWithIndex') IS NOT NULL
    begin
            drop table #TempTableWithIndex
    end
    
    
    CREATE TABLE #TempTableWithIndex 
    ( 
        OrderID int
    )
    
    
    CREATE INDEX IX_TEMPTABLE_TempTableWithIndex_OrderID ON #TempTableWithIndex (OrderID)
    
    
    Insert into #TempTableWithIndex (OrderID) select top 5 OrderID from dbo.Orders
    
    
    Select * from dbo.[Order Details] od where exists (select null from #TempTableWithIndex innerHolder where innerHolder.OrderID = od.OrderID )
    
    
    
    /* Variable Table */
    
    
    Declare @HolderTable TABLE (    OrderID int   )
    
    
    Insert into @HolderTable (OrderID) select top 5 OrderID from dbo.Orders
    
    
    Select * from dbo.[Order Details] od where exists (select null from @HolderTable innerHolder where innerHolder.OrderID = od.OrderID )
    
    
    /* Derived Table */
    
    
    Select * from dbo.[Order Details] od
    join
    ( select top 5 OrderID from dbo.Orders ) as derived1
    on od.OrderID = derived1.OrderID
    
    
    
    /* Clean up */
    
    IF OBJECT_ID('tempdb..#TempTableNoIndex') IS NOT NULL
    begin
            drop table #TempTableNoIndex
    end
    
    
    IF OBJECT_ID('tempdb..#TempTableWithIndex') IS NOT NULL
    begin
            drop table #TempTableWithIndex
    end