13

如果您在存储过程中创建一个临时表并希望在其上添加一个或两个索引,以提高针对它所做的任何其他语句的性能,最好的方法是什么?Sybase 是这样说

"创建索引时表必须包含数据。如果创建临时表并在空表上创建索引,则 Adaptive Server 不会创建柱状图和密度等列统计信息。如果在创建索引后插入数据行,优化器的统计数据不完整。”

但最近一位同事提到,如果我在与实际使用临时表的存储过程不同的存储过程中创建临时表和索引,则 Adaptive Server 优化器能够使用它们。

总的来说,我不太喜欢增加一点价值的包装程序,所以我实际上并没有测试这个,但我想我会把问题放在那里,看看是否有人有任何其他的方法或建议?

4

3 回答 3

7

一些想法:

  • 如果您的临时表太大以至于您必须对其进行索引,那么有没有更好的方法来解决问题?
  • 您可以通过提供以下形式的优化器提示来强制它使用索引(如果您确定索引是访问表的正确方法):

    SELECT * 
    FROM   #table (index idIndex) 
    WHERE  id = @id
    

如果您对一般的性能技巧感兴趣,我已经在这里详细回答了一些其他问题:

于 2008-09-30T15:53:12.073 回答
3

将数据放入临时表后添加索引有什么问题?

您需要注意的一件事是索引对可能同时运行的过程的其他实例的可见性。

我喜欢为这些临时表(和索引)添加一个 guid,以确保永远不会发生冲突。这种方法的另一个好处是您可以简单地使临时表成为真正的表。

另外,请确保在存储过程运行期间,您需要多次查询这些临时表中的数据,否则创建索引的成本将超过选择的好处。

于 2008-09-10T11:45:09.317 回答
1

在 Sybase 中,如果您创建一个临时表,然后在一个 proc 中使用它,则使用表中估计的 100 行来构建选择计划。(该计划是在填充表之前程序开始时构建的。)这可能导致临时表被表扫描,因为它只有“100 行”。调用另一个 proc 会导致 Sybase 使用实际行数为 select 构建计划,这允许优化器选择更好的索引来使用。我已经看到使用这种方法的显着改进,但在您的数据库上进行测试,因为有时没有区别。

于 2008-09-15T20:29:42.413 回答