2009-11-12 49 views
1

我有一些搜索功能(存儲過程),需要返回結果完全相同的列。您應該使用臨時表在存儲過程之間傳遞數據嗎?

這是已採取的方法:

每個存儲過程具有以下一般結構:

CREATE TABLE #searchTmp (CustomerID uniqueIdentifier)

INSERT INTO #searchTmp 
SELECT C.CustomerID FROM /**** do actual search here, based 
           on stored proc arguments ****/ 

EXEC spSearchResults 

DROP TABLE #searchTmp 

在上文中,spSearchResults使用#searchTmp表中選擇。 spSearchResults總是會返回一個具有相同列的表,並且有很多連接。

但是,而不是使用臨時表,是下面的方法更易於接受。

SELECT col1, col2, col3, col4, .... etc, lots of columns ... FROM table1 LEFT JOIN table 2 ON ... etc, lots of joins ... WHERE ... DO ACTUAL SEARCH HERE ...

如果有10次不同的搜索做的(如搜索客戶基於郵政編碼,一個搜索基於姓氏等),這第二種方法意味着有大量的指定列和連接的重複。如果使用搜索功能的代碼發生變化,需要返回一個新列,那麼需要更新10個存儲過程。

我都贊成第一種方法,但我只是想知道第二種方法有什麼好處。性能?

還是有第三種方法?

回答

1

只要臨時表內容代表最後的一組要輸出的唯一鍵,並且以後不再對結果集進行修剪,那麼它是實現您的需求的一種非常有效的方式。

只有當臨時表包含在後續查詢中進一步減少的中間鍵集時,纔會出現問題。在這種情況下,讀取一個查詢中的所有數據將會更有效。

編輯:正如Mark所說,由於查詢優化程序能夠在單個查詢方法中使用多個線程,但不能使用臨時表方法,因此可能會有性能差異。您必須權衡這種潛在收益與臨時表方法的可維護性的巨大改進,並決定哪一項對您更重要。像往常一樣,數據庫問題最好衡量性能而不是猜測。

0

第二個應該表現更好。它將會使你想返回的數據的比例更小。

第二個給查詢優化器以任何順序執行查詢的機會,第一個強制從第一個表中選擇第一個表(您的情況可能是需要的)。您也可以使用第二個並行查詢,即多個線程在查詢上工作,因爲優化器可以執行此操作。

要檢查此運行Showplan(Sybase或SQL Server)或EXPLAIN(Iracle)等,以查看生成的實際查詢。

0

如果使用Microsoft SQL Server,我更喜歡第三種方法:

Create Function GetSearchKeys([Search parameters here]) 
Returns @Keys Table (pk Int Primary Key Not Null) 
As 
Begin 
     Insert @Keys(pk) 
     Select C.CustomerID 
     From /**** do actual search here, based 
       on Search parameters ****/ 
     Return 
End 

    -- ---------------------------------------------------- 

,然後在每一個存儲過程,

SELECT col1, col2, col3, col4, .... etc, lots of columns ... 
    FROM table1 
    LEFT JOIN table 2 
     ON ... etc, lots of joins 
    Join schema.GetSearchKeys([Search parameters here]) K 
     on K.pk = [whatever table.column has the primary key in it] 
相關問題