2010-03-16 271 views
0

我有這樣的要求:過濾和獲取數據或過濾器然後獲取數據更快嗎?

SELECT myTable.ID, 
myTable.Adress, 
-- 20 more columns of all kind of type 
FROM myTable 
WHERE EXISTS(SELECT * FROM myLink 
    WHERE myLink.FID = myTable.ID 
    and myLink.FID2 = 666) 

myLink的有很多行。

你認爲這是更快地這樣做:

INSERT INTO @result(ID) SELECT myLink.FID 
FROM myLink 
WHERE myLink.FID2 = 666 

UPDATE @result SET Adress = myTable.Adress, 
    -- 20 more columns of all kind of type 
    FROM myTable 
    WHERE myTable.ID = @result.ID 
+1

你的兩個查詢是非常不同的 - 第一個只是選擇,第二個是更新。你是在問不同的方式來選擇或不同的方式來更新? – Oded 2010-03-16 13:38:18

+0

你只是試圖強制從一個表到另一個表中的所有「匹配的ID」的鏈接?即:您的myLink是您的主表,myTable是其他工作表,並且您希望將所有記錄更新爲另一個(或者表格反之亦然)?或者...是否有其他進程針對@result提取進行。 – DRapp 2010-03-16 13:48:45

+0

2個查詢的結果是相同的:我有一張表,其中包含ID和來自myTable的數據,而且我只有鏈接到ID2 666的記錄。 不同之處在於,第一次獲取數據和I在同一時間選擇記錄。在第二個請求中,我選擇了記錄,一旦我有了我的記錄ID,我就可以得到這些數據。 – 2010-03-16 14:00:44

回答

2

您將要選擇儘量少的行越好。使用where子句過濾數據是一個好主意,因爲服務器必須返回更少的數據。在第二個版本中,您只選擇一個myLink項目,然後對其進行處理,而在第一個示例中,您獲得了select *,這通常是一個糟糕的主意。

有什麼不妥:

SELECT myTable.etc from myTable,myLink where myLink.FID2= 666 AND myLink.ID=myTable.ID 

這構建了一個聯接和過濾器中的一個步驟。也許一種不同類型的連接會更有效,但代碼確實看起來更短。

+0

當您使用存在時,您可以使用「select *」沒有區別 http://blog.sqlauthority.com/2008/02/26/sql-server-select-1-vs-select-an-interesting-觀察/ 而我不喜歡只做一個連接來過濾數據,因爲你可以得到重複的行。 – 2010-03-16 14:04:27

相關問題