2013-12-05 5 views
1

мне нужно, чтобы установить значение в моей основной таблице из таблицы перекодировки, как это:Как ускорить HSQLDB UPDATE от SELECT?

UPDATE primary 
SET primary.value = 
    (SELECT lookup.value FROM lookup WHERE primary.key = lookup.key) 

Ключа является полем VARCHAR в обеих таблицах и имеет индекс в основной таблице и уникальный индекс в Справочная таблица.

Обе таблицы имеют диапазон около 10 миллионов строк.

Это занимает невероятно долгое время с HSQLDB 2.3 на быстром сервере с 12 ядрами и выделенном 15 Гб пространства.

Что я должен знать, чтобы максимально ускорить эту операцию? Есть ли что-то, что я мог бы сделать массово неправильно, чтобы производительность могла сильно пострадать? Имеет ли серьезный эффект максимальный размер задействуемого ключевого поля VARCHAR?

Я видел, что в теории существуют альтернативные способы, как это сделать в SQL, о которых люди заявили, что они намного быстрее, но HSQLDB, похоже, не поддерживает ни один из них.

+0

Что такое «невероятно долго»? – halfbit

+0

Пожалуйста, разместите определенные индексы в соответствующих таблицах. Вы попробовали заявление 'MERGE'? Вы можете присоединиться к нему. –

+0

И на самом деле вопрос: почему вы делаете это обновление в первую очередь? Если 'primary.key' ссылается на таблицу' lookup', вы всегда можете присоединиться к таблице 'lookup' в ваших запросах. Насколько я могу судить, вы фактически дублируете данные, на которые ссылается внешний ключ. –

ответ

0

ответ один:

То, что вы на самом деле делаете: диспетчерская 10 миллионов (суб-) выбирает базу данных (по крайней мере, в большинстве DB Systems). Я не знаю, реальные потребности позади, но я хотел бы попытаться решить эту проблему с чем-то вроде EXPORT/НАГРУЗКИ Таблицы в пакете

ответа два:

Вы, вероятно, получите потрясающее Запирание и ведение журнала (LOGFILE) проблемы. еще раз: Я хотел бы попробовать это с чем-то вроде EXPORT/НАГРУЗКИ Таблица в партии

EDIT: Экспорт/импорт - я не знаю (необходимый) синтаксис, основы

EXPORT 
    select -needed fields- 
    from 
     primary, lookup 
    where 
     primary.key = lookup.key -- this will be fast 


IMPORT into primary pevios EXPORT 

редактировать: попробовать Somthing как «Стол блокировки в эксклюзивном режиме», прежде чем начинать обновление

+0

Спасибо, что это отличная идея для решения моей проблемы! Просто трудно поверить, что HSQLDB действительно не имеет ничего, что можно было бы реально обновить таблицу. Я серьезно сомневаюсь в моем решении использовать HSQLDB уже. Как я уже сказал, я обычно делал это без подзапроса, используя правильный синтаксис JOIN, но HSQLDB, похоже, не поддерживает это (хотя я не уверен, что для этого не существует другого способа) – Johsm

+0

@Johsm Его не реально DB (система); в то время как я пишу это, попробуйте somthing, как «Lock Table в эксклюзивном режиме», прежде чем начать обновление. – halfbit

+0

Я фактически использую пару утверждений, которые предположительно должны ускорить работу: autocommit off, отсутствие файлов журнала, размер NIO, управление транзакциями MVCC, но это мало помогло. Что касается вашего предложения, я думаю, что может быть даже быстрее просто создать новую «основную» таблицу напрямую, используя вставку INSERT INTO newprimary (поля). SELECT fields FROM primary, lookup WHERE ... – Johsm