最佳使用T-SQL中的临时表上的索引
时间:2020-03-05 18:50:38 来源:igfitidea点击:
如果要在存储过程中创建临时表并希望在其上添加一个或者两个索引,以提高针对该存储过程做出的任何其他语句的性能,最佳方法是什么? Sybase这样说:
"创建索引时,表必须包含数据。如果创建临时表并在空表上创建索引,则Adaptive Server不会创建列统计数据,例如直方图和密度。如果在创建索引后插入数据行,优化器的统计信息不完整。"
但是最近一位同事提到,如果我在与实际使用临时表的存储过程不同的存储过程中创建临时表和索引,则Adaptive Server优化程序将可以使用它们。
总体而言,我不太喜欢包装程序并没有多大价值,所以我实际上还没有进行测试,但是我想我应该把这个问题放在那儿,看看是否还有其他人方法或者建议?
解决方案
回答
将数据放入临时表后添加索引有什么问题?
我们需要注意的一件事是索引对可能同时运行的其他过程实例的可见性。
我喜欢为这类临时表(以及索引)添加向导,以确保不存在冲突。这种方法的另一个好处是,我们可以简单地使temp表成为真实表。
另外,请确保在存储过程运行期间需要多次查询这些临时表中的数据,否则创建索引的成本将超过选择所带来的好处。
回答
在Sybase中,如果我们创建一个临时表,然后在一个proc中使用它,则该选择计划将使用该表中的100行估算得出。 (该计划是在填充表之前在过程开始时生成的。)这可能会导致对临时表进行表扫描,因为临时表只有" 100行"。调用另一个proc会导致Sybase使用实际的行数来为select构建计划,这使优化器可以选择更好的索引来使用。我已经看到使用这种方法的显着改进,但是在数据库上进行测试,因为有时没有区别。
回答
一些想法:
- 如果临时表太大而必须索引,那么是否有更好的方法来解决该问题?
- 我们可以通过以下形式的优化提示来强制它使用索引(如果我们确定索引是访问表的正确方法):
SELECT * FROM #table (index idIndex) WHERE id = @id
如果我们总体上对性能技巧感兴趣,那么我在这里已经回答了一些其他问题:
- 最喜欢的性能调整技巧
- 我们如何针对特定查询优化表?