gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:12:04 25 4
gpt4 key购买 nike

我有一个存储过程,它创建并使用临时#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com