2016-04-21 3 views
1

В настоящее время я использую следующий запрос для вставки в таблицу только в том случае, если запись еще не существует, по-видимому, это приводит к сканированию таблицы. Он вставляет 28000 записей в течение 10 минут:Увеличение скорости INSERT

INSERT INTO tblExample(column) 
(SELECT ? FROM tblExample WHERE column=? HAVING COUNT(*)=0) 

Если изменить запрос к следующему, я могу вставить 98000 записей в течение 10 минут:

INSERT INTO tblExample(column) VALUES (?) 

Но это не будет проверять, является ли запись уже существует.

Может ли кто-нибудь предложить другой способ запроса, чтобы скорость вставки была быстрее?

+4

У вас есть уникальный индекс в столбце? Это ускорит запрос поиска и обеспечит ограничение (в случае, если вы пропустили его в своем коде). – Thilo

+0

Спасибо @Thilo. Я взял основной ключ из таблицы, потому что я прочитал, что с PK увеличивается время, затраченное на вставку. Вы предполагаете, что я использую ПК и поймаю ошибку, если найден дубликат? – jdie8274j

+0

Наличие PK замедляет вставку, но если вы не уверены, что данные уникальны, вам нужна эта проверка ограничений. Так что да, верните это. – Thilo

ответ

1

Одним простым решением (но не рекомендуется) может быть просто оператор insert, поймать дублирующее ключевое исключение и зарегистрировать его. Предполагая, что таблица имеет уникальное ограничение ключа.

+0

Откуда вы знаете уникальный индекс? – Thilo

+0

Извините, обновил свой ответ. –

+0

Это то, с чем я пошел, и производительность действительно улучшилась. Благодаря! – jdie8274j

1

Убедитесь, что у вас есть указатель на столбце [s], который вы проверяете. В общем, посмотрите план выполнения запроса, который использует база данных - это должно сказать вам, где время идет, и что с этим делать.

Для Derby db это how you get a plan and how to read it.

Derby also has a merge command, который может действовать как вставка-если-нет. Я не использовал его сам, поэтому вам нужно проверить его, чтобы узнать, быстрее ли это для ваших обстоятельств.