2009-11-12 54 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] 
相关问题