谢谢你,astander。
我试着用下面给出的例子。两种方法都花了19秒。不过,我想一些调整会帮助表变量更新方法变得比LEFT JOIN更快。
因为我不是高手,所以请求您的帮助。任何SQL专家准备证明它?
----请用下面的''替换“”。我不熟悉如何把代码在这个论坛...它会导致一些麻烦....
CREATE TABLE #MainTable (
CustomerID INT PRIMARY KEY,
FirstName VARCHAR(100)
)
DECLARE @Count INT
SET @Count = 0
DECLARE @Iterator INT
SET @Iterator = 0
WHILE @Count <8000
BEGIN
INSERT INTO #MainTable SELECT @Count, "Cust"+CONVERT(VARCHAR(10),@Count)
SET @Count = @Count+1
END
CREATE TABLE #RightTable
(
OrderID INT PRIMARY KEY,
CustomerID INT,
Product VARCHAR(100)
)
CREATE INDEX [IDX_CustomerID] ON #RightTable (CustomerID)
WHILE @Iterator <400000
BEGIN
IF @Iterator % 2 = 0
BEGIN
INSERT INTO #RightTable SELECT @Iterator,2, "Prod"+CONVERT(VARCHAR(10),@Iterator)
END
ELSE
BEGIN
INSERT INTO #RightTable SELECT @Iterator,1, "Prod"+CONVERT(VARCHAR(10),@Iterator)
END
SET @Iterator = @Iterator+1
END
-- Using LEFT JOIN
SELECT mt.CustomerID,mt.FirstName,COUNT(rt.Product) [CountResult]
FROM #MainTable mt
LEFT JOIN #RightTable rt ON mt.CustomerID = rt.CustomerID
GROUP BY mt.CustomerID,mt.FirstName
---------------------------
-- Using Table variable Update
DECLARE @WorkingTableVariable TABLE
(
CustomerID INT,
FirstName VARCHAR(100),
ProductCount INT
)
INSERT
INTO @WorkingTableVariable (CustomerID,FirstName)
SELECT CustomerID, FirstName FROM #MainTable
UPDATE @WorkingTableVariable
SET ProductCount = [Count]
FROM @WorkingTableVariable wt
INNER JOIN
(SELECT CustomerID,COUNT(rt.Product) AS [Count]
FROM #RightTable rt
GROUP BY CustomerID) IV ON wt.CustomerID = IV.CustomerID
SELECT CustomerID,FirstName, ISNULL(ProductCount,0) [CountResult] FROM @WorkingTableVariable
ORDER BY CustomerID
--------
DROP TABLE #MainTable
DROP TABLE #RightTable
感谢 Lijo
这是一个城市神话。表变量存在于tempdb中。在这里检查Q&A4:http://support.microsoft.com/kb/305977新版本仍然如此。 – 2010-02-17 13:57:10
@Frank Kalis - 不是表格变量**在内存中的都市神话,事实上,他们**可以**持久化到tempdb,这取决于内存压力等因素。 – AdaTheDev 2010-02-17 15:55:35
没有。它们存在于tempdb中,但它们保存的数据可能也可能不会保存到tempdb中。对于任何表(永久,临时或表变量),分配映射中至少有一个页面,磁盘上至少有一个数据页面。 SQL Server不能在缓冲池中拥有一个页面,而不在磁盘上有一个保留的对应页面。然而,表变量的数据页面可能永远不会写入tempdb,但空间仍然存在。 – 2010-02-17 20:19:16