问题描述
select optimizer;
它回来了
SELECT: identifier 'optimizer' unkNown
它有什么问题?而且我在使用 \d 的数据库中找不到 sys 表。
解决方法
自 2020 年 10 月以来,变量现在具有架构(以保留其他 SQL 对象)。在您的会话中,'sys' 不是会话的架构,这就是为什么它找不到 'optimizer' 变量,表也是如此。
在默认分支(将在下一个版本中可用)中,我在用户上添加了一个“模式路径”属性,以搜索除当前会话模式之外的 SQL 对象。默认情况下,它包含“sys”架构。
,对于您的第一个问题:如果您的 current_schema
不是 sys
,您需要使用 select sys.optimizer;
。
对于您的第二个问题:现有的最佳示例可能在 monetdb5/extras/mal_optimizer_template
中。接下来,它基本上是检查源代码以了解其他优化器是如何实现的。注意,虽然这种情况并不经常发生,但 MonetDB 的内部结构可能会在(主要)版本之间发生变化。我建议您使用 Oct2020 或更新版本。
关于你的第二个问题,
您还必须创建优化器管道并将其添加到 opt_pipes.c
。查找 default_pipe
,然后将其复制/粘贴到新管道并将优化器添加到其中。
您可能需要在更多地方添加优化器,例如 codes[]
中的 opt_wrapper.c
数组。只需模仿 "reorder"
等标准优化器之一。