tsql - Sybase 存储过程 - 如何在 #table 上创建索引?

标签 tsql stored-procedures indexing sap-ase

我有一个存储过程,它创建并使用临时#table

如果临时 #table 上创建了索引,某些查询将会得到极大的优化。

但是,在存储过程中创建索引失败:

create procedure test1 as
SELECT f1, f2, f3
INTO   #table1
FROM   main_table
WHERE  1 = 2

-- insert rows into #table1

create index my_idx on #table1 (f1)

SELECT f1, f2, f3 FROM #table1 (index my_idx) WHERE f1 = 11 -- "QUERY X"

当我调用上面的代码时,“QUERY X”的查询计划显示表扫描。

如果我只是在存储过程之外运行上面的代码,消息将显示以下警告:

Index 'my_idx' specified as optimizer hint in the FROM clause of table '#table1' does not exist. Optimizer will choose another index instead.

当运行临时(存储过程之外)时,可以通过在创建索引后添加“go”将上面的代码分成两批来解决:

create index my_idx on #table1 (f1)
go

现在,“QUERY X”查询计划显示索引“my_idx”的使用。

问题:当“创建索引”位于存储过程内时,如何在单独的批处理中模拟运行“创建索引”?我无法像上面的临时副本那样在那里插入“go”。请注意,我知道“将‘QUERY X’拆分为一个单独的存储过程”的解决方案,并且正在寻找一种可以避免这种情况的解决方案。

附注如果重要的话,这是在 Sybase 12 (ASE 12.5.4) 上

<小时/>

更新:

在提出问题之前,我在谷歌搜索期间看到了一些关于“架构碰撞”的引用。但在我的例子中,这种情况似乎没有发生。

You can create a table, populate it, create an index on it and select values from it in the same porc and have the optimizer fully cost it based on accurate information. This is called 'schema bumping' and has been in place since 11.5.1.

最佳答案

Sybase 文档说您可以在同一存储过程中创建和使用临时索引:

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.dc20023_1251/html/optimizer/X26029.htm

我认为要解决这个问题,您需要将存储过程分成至少两部分,一部分用于创建和填充表,然后构建索引,第二部分用于运行选择查询。

关于tsql - Sybase 存储过程 - 如何在 #table 上创建索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5187881/

相关文章:

涉及 group by 和 join 的 SQL 查询

mysql - 优化mysql中的反向LIKE查询

c++ - 为什么这行得通?不合逻辑的数组访问

sql-server - WAITFOR 对其他流程和事务有什么影响?

SQL Server 有效地过滤时间与另一个表的时间不接近的行

sql - 如何防止从 Informix 存储过程返回的长文本值中出现换行符

mysql - 使用在 MySQL 存储过程中不起作用的 Max() 函数将最大 Id 提取到变量中

sql - SQL中簇索引和非簇索引的区别

c# - SQL Server 中的 EncryptByPassPhrase 和 C# 中的 Triple DES 解密

MYSQL 更新等待批准