关于优化器的一些事

Something about the optimizer

  1. 我创建了一个数据库并与之连接。但是当我执行
select optimizer;

它returns

SELECT: identifier 'optimizer' unknown

它有什么问题?而且我无法使用 \d.

在数据库中找到 sys table
  1. 如果我想添加一个优化器myopt,是否足以完成以下步骤:
    1. 在/monetdb5/optimizer/
    2. 中写入opt_myopt.h和opt_myopt.c
    3. 将代码添加到/monetdb5/optimizer/opt_wrapper.c
    4. 中的codes
    5. 将函数添加到optimizer_init_funcs中/monetdb5/optimizer/optimizer.c
    6. 在 /monetdb5/optimizer/opt_pipes.c
    7. 中添加新管道

自 2020 年 10 月起,变量现在有一个架构(以保持其他 SQL 对象)。在您的会话中,'sys' 不是会话的架构,这就是为什么它找不到 'optimizer' 变量的原因,表也是如此。

在默认分支中(将在下一个版本中可用)我在用户上添加了一个“模式路径”属性 以搜索 SQL 除当前会话模式之外的对象。默认情况下,它包含 'sys' 架构。

关于你的第一个问题:如果你的current_schema不是sys,你需要使用select sys.optimizer;

关于你的第二个问题:现有最好的例子可能在monetdb5/extras/mal_optimizer_template中。除此之外,它基本上是检查源代码以查看其他优化器是如何实现的。注意,尽管这种情况并不经常发生,但 MonetDB 的内部结构可能会在(主要)版本之间发生变化。我建议您使用 2020 年 10 月或更新版本。

关于你的第二个问题,

您还必须创建优化器管道并将其添加到 opt_pipes.c。查找 default_pipe,然后 copy/paste 将其添加到新管道并将优化器添加到其中。

还有一些地方您可能需要添加优化器,例如 opt_wrapper.c 中的 codes[] 数组。只需模仿标准优化器之一,如 "reorder".