关于优化器

问题描述

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

它回来了

SELECT: identifier 'optimizer' unkNown

它有什么问题?而且我在使用 \d 的数据库中找不到 sys 表。

  1. 如果我想添加一个优化器 myopt,是否足以执行以下步骤:
    1. 将 opt_myopt.h 和 opt_myopt.c 写入 /monetdb5/optimizer/
    2. 代码添加到 /monetdb5/optimizer/opt_wrapper.c 中的 codes
    3. 将该函数添加到/monetdb5/optimizer/optimizer.c中的optimizer_init_funcs
    4. 在 /monetdb5/optimizer/opt_pipes.c 中添加一个新管道

解决方法

自 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" 等标准优化器之一。