謝謝你,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