这是我尝试的“典型”。我通常会尝试它们,看看在负载和代表生产行号而不是开发行号的“大数据”下会发生什么。
从记忆中走。
- 如果是“一次性”使用,我尝试使用派生表方法。
- 如果可以重用“持有人”表中的数据,如果行数很少,我会从 @variableTable 开始。2.b。我唯一一次看到@variableTable 的问题是,如果你做了一些汇总结果……“汇总行”只有少数几行,但要生成汇总行,你会遇到大量行。想想像“Select StateAbbreviation, count(*) from dbo.LargeTableOfData”......结果表中只有 50 行左右,但聚合数据来自一个有很多行的大表。
- 然后我去#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