0

在加入其他几个表之前先将数据放入临时表中是个好主意吗?

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

  • 表A,500万行
  • 表 B,500 万行
  • 表C,500万行
    ...
  • 表G

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

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 中提取数据是否是个好主意,以避免阻塞并可能提高性能

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

4

1 回答 1

1

这是我尝试的“典型”。我通常会尝试它们,看看在负载和代表生产行号而不是开发行号的“大数据”下会发生什么。

从记忆中走。

  1. 如果是“一次性”使用,我尝试使用派生表方法。
  2. 如果可以重用“持有人”表中的数据,如果行数很少,我会从 @variableTable 开始。2.b。我唯一一次看到@variableTable 的问题是,如果你做了一些汇总结果……“汇总行”只有少数几行,但要生成汇总行,你会遇到大量行。想想像“Select StateAbbreviation, count(*) from dbo.LargeTableOfData”......结果表中只有 50 行左右,但聚合数据来自一个有很多行的大表。
  3. 然后我去#TempTable。大多数时候没有索引。有时带有索引。在我的生活中,#TempTable 上的索引有 2 到 3 次显着改善。

这是一个“试玩游戏”。有时你只是不知道,直到你给它 ole College 尝试。

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
于 2013-06-05T19:50:00.823 回答