#monetdb
#monetdb
Вопрос:
- Я создаю базу данных и подключаюсь к ней. Но когда я выполняю
select optimizer;
он возвращает
SELECT: identifier 'optimizer' unknown
В чем проблема с этим? И я не могу найти таблицу sys в базе данных, используя d .
- Если я хочу добавить оптимизатор myopt, достаточно ли этого для выполнения следующих действий:
- напишите opt_myopt.h и opt_myopt.c в /monetdb5/optimizer/
- Добавьте код в codes в /monetdb5/optimizer/opt_wrapper.c
- Добавьте функцию в optimizer_init_funcs в /monetdb5/optimizer/optimizer.c
- Добавьте новый канал в /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 .