Sql 如何在更新或插入时使用计划

Sql 如何在更新或插入时使用计划,sql,firebird,sql-execution-plan,insert-update,firebird2.5,Sql,Firebird,Sql Execution Plan,Insert Update,Firebird2.5,我正在使用Firebird 2.5,遇到了一个我自己无法解决的问题 有一条语句使用了UPDATE或INSERT-to。我想让它使用一个具体的执行计划。但是-无论我将计划放置在何处-我都会收到以下错误消息(行号随计划的位置而变化): 无效令牌。 动态SQL错误。 SQL错误代码=-104。 令牌未知-第2行第5列。 计划 在中,我没有找到有关使用PLANwithUPDATE或INSERT-in的任何信息 我的问题的各个方面:是否有可能将它们结合使用?这是有效的还是计划在Firebird的更高版本中

我正在使用Firebird 2.5,遇到了一个我自己无法解决的问题

有一条语句使用了
UPDATE或INSERT-to
。我想让它使用一个具体的执行计划。但是-无论我将
计划放置在何处
-我都会收到以下错误消息(行号随
计划的位置而变化):

无效令牌。
动态SQL错误。
SQL错误代码=-104。
令牌未知-第2行第5列。
计划

在中,我没有找到有关使用
PLAN
with
UPDATE或INSERT-in
的任何信息


我的问题的各个方面:是否有可能将它们结合使用?这是有效的还是计划在Firebird的更高版本中有效?是否有一个明显的原因,它不起作用,我没有看到?有哪些替代方案可以避免这种情况?

在Firebird 2.5中不可能做到这一点(在3.0中也不可能做到这一点)。查看,
计划
条款仅在以下方面受支持:

对于语句,应该可以为源指定计划(如果是select查询),但不能为合并本身指定计划。plan子句未定义为(例如,
insert


据我所知,没有计划将此添加到Firebird 4中。你应该考虑在追踪器中添加一个改进的票,但我不知道这是否甚至是可能的。

为什么你想“使用一个特定的执行计划”?有一个对应的索引与语句的
matching
-子句相匹配。我希望Firebird在不考虑当前索引选择性的情况下使用它,因为它可能已经过时,并且我知道它是该语句的最佳索引。此外,我喜欢索引的依赖关系。事实上,我理解,可能不需要使用
计划
。我只想知道,在这种情况下是否可以使用它,如果不可以,为什么不可以使用它。我不相信可以显式地为多语句变量命令(MERGE和UPDATE-OR-INSERT)指定计划。这些基本上是分支元指令,根据某些条件选择不同的“执行路径”。在计划子类语法中没有“条件分支”。因此,这是不可能的。如果您真的需要它-使用存储过程和
来选择。。。作为光标
循环。您也可以在此处询问或不提及计划子条款