【问题标题】:Best use of indices on temporary tables in T-SQLT-SQL 中临时表索引的最佳使用
【发布时间】:2010-09-08 09:34:11
【问题描述】:

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

“创建索引时表必须包含数据。如果创建临时表并在空表上创建索引, Adaptive Server 不会创建列统计信息,例如直方图和密度。如果插入数据创建索引后的行,优化器统计不全。”

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

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

【问题讨论】:

    标签: tsql indexing sap-ase temp-tables


    【解决方案1】:

    一些想法:

    • 如果你的临时表太大了,你必须索引它,那么有没有更好的方法来解决这个问题?
    • 你可以通过给出优化器提示来强制它使用索引(如果你确定索引是访问表的正确方法),格式如下:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-03
          • 2018-08-29
          • 1970-01-01
          • 2011-02-24
          • 1970-01-01
          • 2011-05-21
          • 2018-05-15
          • 2020-11-18
          相关资源
          最近更新 更多