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 个存储过程需要更新。

我完全赞成第一种方法,但我只是想知道第二种方法有什么好处。表现?

还是有第三种方法?

4

3 回答 3

1

只要临时表的内容代表要输出的最终唯一键集,并且之后不对结果集进行进一步修剪,那么它就是实现您的要求的一种非常有效的方法。

仅当临时表包含一组中间键(在后续查询中进一步减少)时,才会出现问题。在这种情况下,在一个查询中读取所有数据会更有效率。

编辑:正如 Mark 所说,由于查询优化器能够在单个查询方法中使用多个线程,但在临时表方法中不能使用,可能存在性能差异。您必须权衡这种潜在收益与临时表方法可维护性的巨大改进,并决定哪个对您更重要。与数据库问题一样,最好衡量性能而不是猜测它。

于 2009-11-12T13:43:55.650 回答
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]
于 2009-11-12T14:32:21.277 回答
0

第二个应该表现更好。它将您要返回的数据的比例较小。

第二个使查询优化器有机会按照它想要的任何顺序进行查询,第一个强制首先从第一个表中进行选择(在您的情况下可能是想要的)。您还可以在第二个,即多个线程处理查询,因为优化器可以做到这一点。

要对此进行检查,请运行 Showplan(Sybase 或 SQL Server)或 EXPLAIN (Iracle) 等以查看生成的实际查询。

于 2009-11-12T13:41:41.820 回答