Sybase存储过程 - 如何在#table上创建索引?
我有一个存储过程创建和使用临时
#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”的查询计划显示了表扫描。
如果我只是在存储过程外部运行上面的代码,则消息显示以下警告:
在表'#table1'的FROM子句中指定为优化器提示的索引'my_idx'不存在。优化器将选择另一个索引。
通过在索引创建后添加“go”,在两个批处理中分割上面的代码,可以在运行ad-hoc(存储过程之外)时解决此问题:
create index my_idx on #table1 (f1)
go
现在,“QUERY X”查询计划显示了索引“my_idx”的使用。
问题:如果在存储过程中存在单独的批处理中,我如何模仿运行“创建索引”?我不能像上面的ad-hoc副本那样插入“go”。请注意,我知道“将'QUERY X'拆分为单独的存储过程”的解决方案,并且正在寻找可以避免这种情况的解决方案。
附:如果重要,这是在Sybase 12上(ASE 12.5.4)
更新:
在提出问题之前,我在谷歌搜索期间看到过几次提到“架构颠簸”。但在我看来似乎并没有发生这种情况。
您可以创建表,填充表,在其上创建索引并选择值
从它在相同的porc和优化器完全花费它的基础上
准确的资讯。这被称为“架构碰撞”并且已经到位
从11.5.1开始。
没有找到相关结果
已邀请:
2 个回复
墩瓣茅械
悍蕾驮苇袜