Кое-что об оптимизаторе

#monetdb

#monetdb

Вопрос:

  1. Я создаю базу данных и подключаюсь к ней. Но когда я выполняю
 select optimizer;
 

он возвращает

 SELECT: identifier 'optimizer' unknown
 

В чем проблема с этим? И я не могу найти таблицу sys в базе данных, используя d .

  1. Если я хочу добавить оптимизатор myopt, достаточно ли этого для выполнения следующих действий:
    1. напишите opt_myopt.h и opt_myopt.c в /monetdb5/optimizer/
    2. Добавьте код в codes в /monetdb5/optimizer/opt_wrapper.c
    3. Добавьте функцию в optimizer_init_funcs в /monetdb5/optimizer/optimizer.c
    4. Добавьте новый канал в /monetdb5/optimizer/opt_pipes.c

Комментарии:

1. В MonetDB не вызывается таблица автоматически sys . Какую таблицу вы ищете? Кроме того, afaik, d перечисляет только созданные пользователем таблицы, а не системные таблицы.

Ответ №1:

Начиная с октября 2020 года, переменные теперь имеют схему (чтобы сохранить ее в других объектах SQL). В вашем сеансе ‘sys’ не является схемой сеанса, поэтому он не может найти переменную ‘optimizer’, одинаковую для таблиц.

В ветке по умолчанию (будет доступна в следующем выпуске) Я добавил свойство «путь к схеме» для пользователя для поиска объектов SQL помимо схемы текущего сеанса. По умолчанию он включает в себя схему ‘sys’.

Ответ №2:

На ваш первый вопрос: если у вас current_schema нет sys , вам нужно использовать select sys.optimizer; .

Что касается вашего второго вопроса: лучший существующий пример, вероятно, находится внутри monetdb5/extras/mal_optimizer_template . Кроме того, он в основном проверяет исходный код, чтобы увидеть, как были реализованы другие оптимизаторы. ПРИМЕЧАНИЕ, хотя это случается не часто, внутренние компоненты MonetDB могут меняться между (основными) версиями. Я бы порекомендовал вам использовать Oct2020 или новее.

Ответ №3:

Что касается вашего второго вопроса,

Вам также необходимо создать и добавить конвейер оптимизатора opt_pipes.c . Найдите default_pipe , а затем скопируйте / вставьте его в новый конвейер и добавьте в него свой оптимизатор.

Есть еще несколько мест, где вам может понадобиться добавить свой оптимизатор, например, в codes[] массиве in opt_wrapper.c . Просто имитируйте один из стандартных оптимизаторов , например "reorder" .

Комментарии:

1. Могу я спросить о функции OPTwrapper? Он использует findSymbol для получения неверного блока оптимизатора (например: costModel) и устанавливает mb=s-> def . Но затем примените оптимизатор к mb , он использует оптимизатор для оптимизации самого себя, а не MAL, который ожидает оптимизации.

2. No mb — это фактический MAL-план, который будет оптимизирован. OPTwrapper — это просто универсальная оболочка, которая выполняет некоторые поверхностные проверки, так что фактические реализации оптимизатора не должны быть обременены этим шаблоном. Как вы можете видеть, в какой-то момент мы вызываем msg = (str)(*(codes[i].fcn))(cntxt, mb, stk, 0); which на самом деле является оптимизатором, который попытается оптимизировать mb.

3. Кстати, случай, на который вы ссылаетесь, является более частным случаем, когда оптимизатор имеет определенную сигнатуру функции mal в качестве параметра, для которого ему необходимо оптимизировать свою реализацию mal. Он должен найти соответствующий блок mal, сначала вызвав findSymbol .