H2 - Создать индекс для связанной таблицы и выполнить JOIN для связанных таблиц - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть таблицы MySQL tableName и table2 с определенными на них индексами.

Я создал в своем приложении Java связанную таблицу tableName с этим запросом:

CREATE LINKED TABLE IF NOT EXISTS tableName('', 'jdbc:mysql://hostName:port/dbName', 'user', 'pass', 'tableName');

Тот же запрос для table2.

Затем я создал tableSelect в базе данных H2 с запросом:

CREATE TABLE tableSelect AS SELECT * FROM tableName WHERE Sex = 'F'

Теперь мое Java-приложение создает индекс, если он не существует в table2, с помощью этого запроса:

CREATE INDEX IF NOT EXISTS DES ON table2(DES);

, и это вызывает ошибку, подобную этой, когда я нажимаю кнопку для повторного запускаquery: org.h2.jdbc.JdbcSQLException: Feature not supported: "LINK"; SQL statement:

Кроме того, если индикаторы определены, я выполняю JOIN для уже определенных индексов, но это слишком медленно. Запрос JOIN включает таблицу в H2 и таблицу в MySQL, то есть связанную таблицу, и она выглядит так:

CREATE TABLE tableNew AS SELECT l.*, CONTR AS Activity FROM t AS ableSelect JOIN table2 AS agg ON l.Contr_Type = agg.DES;

Как я могу оптимизировать этот JOIN?

1 Ответ

0 голосов
/ 30 сентября 2019

Невозможно создать индекс для связанной таблицы в H2 по непонятным причинам. Но вы можете создать такой индекс в MySQL, и он будет использоваться. Однако, если вам нужно объединить много строк, которые вы запрашиваете, все равно будет работать очень медленно.

Вы можете создать дополнительную временную копию таблицы из MySQL в H2 с помощью CREATE TABLE newName AS SELECT … FROM linkedTable, создать все необходимые индексы в этой копии,и используйте его в JOIN вместо связанной таблицы. Конечно, эта копия не будет отражать изменения, выполненные в базе данных MySQL.

Если обе стороны JOIN являются связанными таблицами, вы можете создать связанную таблицу с запросом и работатьс ним.

CREATE LINKED TABLE tableName('', 'jdbc:…', 'user', 'password', '(SELECT … FROM … JOIN … ON …)');

Такой запрос будет выполняться MySQL, и он должен быть относительно быстрым.

...