2012-11-27 72 views
3

不幸的是,當我們修復我們的數據中心時,我需要運行以下跨服務器查詢,任何人都可以建議如何讓性能提高...加入鏈接服務器表時提高查詢性能

如要在光標開始運行該語句

SELECT t.SearchId, t.VisitSourceId, t.SiteDomainId, t.trpUTMid, t.FlightPlus, t.StartDate, 
t.CountryId, t.ProvinceId, t.Locationid, t.PlaceId, t.EstabId, t.CheckInDate, 
t.CheckOutDate, t.Rooms, t.Room1Adults, t.Room1Children, t.Room2Adults, t.Room2Children, 
t.Room3Adults, t.Room3Children, tc.OutcomeDate, tc.OutcomeId, tc.HotelsFound, tc.Notes 

FROM [MLT_VisitTracking].[dbo].TrackingAcomSearches_tbl t 
INNER JOIN TrackingAcomSearchesOutcome_tbl tc 
ON t.trpUTMid = tc.trpUTMid 
LEFT JOIN [YAZOO].[MLT_VisitTracking].[dbo].TrackingAcomSearches_tbl tid 
ON t.trpUTMid = tid.trpUTMid 
WHERE tid.trpUTMid IS NULL 
+1

有此網站上有關提高鏈接的服務器的查詢性能的幾個問題,他們幫忙了嗎?你可以提供哪些特定的信息(rowcount,查詢中預期的rowcount)以及當前的執行計劃?底線是鏈接的服務器總是很慢;你有選擇將數據從一臺服務器移動到另一臺服務器,然後運行查詢? – Pondlife

回答

2

一個可能的選擇是獲得遠程表複製到TH本地服務器。這會將所有表放在同一臺服務器上,使優化器可以使用統計信息生成最佳計劃。由於您只使用trpUTMid,因此您可以複製該列。

另一個選擇是使用臨時表。同樣的想法,得到了相同的服務器上的所有表:

SELECT trpUTMid 
INTO #Yazoo_TrackingAcomSearches_tbl 
FROM [YAZOO].[MLT_VisitTracking].[dbo].TrackingAcomSearches_tbl 


SELECT t.SearchId, t.VisitSourceId, t.SiteDomainId, t.trpUTMid, t.FlightPlus, t.StartDate, 
t.CountryId, t.ProvinceId, t.Locationid, t.PlaceId, t.EstabId, t.CheckInDate, 
t.CheckOutDate, t.Rooms, t.Room1Adults, t.Room1Children, t.Room2Adults, t.Room2Children, 
t.Room3Adults, t.Room3Children, tc.OutcomeDate, tc.OutcomeId, tc.HotelsFound, tc.Notes 

FROM [MLT_VisitTracking].[dbo].TrackingAcomSearches_tbl t 
INNER JOIN TrackingAcomSearchesOutcome_tbl tc 
ON t.trpUTMid = tc.trpUTMid 
LEFT JOIN #Yazoo_TrackingAcomSearches_tbl tid 
ON t.trpUTMid = tid.trpUTMid 
WHERE tid.trpUTMid IS NULL 

你也可以在臨時表上創建索引來提高性能。

我也建議檢查是否存在不足,而不是老左加入了空(更多信息閱讀this):

SELECT trpUTMid 
INTO #Yazoo_TrackingAcomSearches_tbl 
FROM [YAZOO].[MLT_VisitTracking].[dbo].TrackingAcomSearches_tbl 


SELECT t.SearchId, t.VisitSourceId, t.SiteDomainId, t.trpUTMid, t.FlightPlus, t.StartDate, 
t.CountryId, t.ProvinceId, t.Locationid, t.PlaceId, t.EstabId, t.CheckInDate, 
t.CheckOutDate, t.Rooms, t.Room1Adults, t.Room1Children, t.Room2Adults, t.Room2Children, 
t.Room3Adults, t.Room3Children, tc.OutcomeDate, tc.OutcomeId, tc.HotelsFound, tc.Notes 

FROM [MLT_VisitTracking].[dbo].TrackingAcomSearches_tbl t 
INNER JOIN TrackingAcomSearchesOutcome_tbl tc 
ON t.trpUTMid = tc.trpUTMid 
WHERE NOT EXISTS (
    SELECT NULL 
    FROM #Yazoo_TrackingAcomSearches_tbl 
    WHERE trpUTMid = t.trpUTMid 
) 
0

嘗試下面的查詢

;with cte 
    as(
    SELECT tc.OutcomeDate, tc.OutcomeId, tc.HotelsFound, tc.Notes 
    GROUP BY [BatchId] FROM TrackingAcomSearchesOutcome_tbl tc 
    ) 
    SELECT t.SearchId, t.VisitSourceId, t.SiteDomainId, t.trpUTMid, t.FlightPlus, t.StartDate, 
    t.CountryId, t.ProvinceId, t.Locationid, t.PlaceId, t.EstabId, t.CheckInDate, 
    t.CheckOutDate, t.Rooms, t.Room1Adults, t.Room1Children, t.Room2Adults, t.Room2Children, 
    t.Room3Adults, t.Room3Children 

    FROM [MLT_VisitTracking].[dbo].TrackingAcomSearches_tbl t 
    INNER JOIN cte as tbl ON t.trpUTMid = tbl .trpUTMid 
    LEFT JOIN [YAZOO].[MLT_VisitTracking].[dbo].TrackingAcomSearches_tbl tid 
    ON t.trpUTMid = tbl .trpUTMid 
    WHERE tid.trpUTMid IS NULL 
+0

它不編譯,我沒有批次 –