2013-12-24 2 views
0

Мне интересно, как сделать этот запрос быстрее.Медленная вставка: выберите из таблицы

Идея состоит в том, чтобы вставить из одной таблицы в другую таблицу с помощью обновления. Уловка состоит в том, что большая таблица составляет около 150 000 строк с ПК на элемент, который я хочу вставить. У меньшего стола около 125 000 строк. Результат, который я ищу, - это вставить skus из большой таблицы в меньшую таблицу, чтобы они имели одинаковое количество строк.

Я попробовал два разных запросов, но это один, пожалуй, самый очевидный:

INSERT INTO item_data 
      (sku) 
SELECT sku 
FROM item_table 
WHERE sku NOT IN (SELECT sku 
        FROM item_data); 

Я также попробовал этот вариант:

INSERT INTO item_data 
      (sku) 
SELECT t1.sku 
FROM (SELECT sku 
     FROM item_data) AS t1, 
     (SELECT sku 
     FROM item_table) AS t2 
WHERE t1.sku <> t2.sku 

(извините, если синтаксис немного не здесь) ,

Я начал с запуска запроса выбора базы, и к моему ужасу, это было очень медленно.

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

Это новая установка и новая база данных без индексов или всего остального, кроме нескольких таблиц, работающих под управлением последнего PgAdmin.

+0

проверка план выполнения запроса и изучения потока данных для получения дополнительной информации, чтобы найти то, что вызывает ваш запрос, чтобы работать медленно. – Murtaza

ответ

2

Ваш второй запрос вернет вам в основном все возможные значения sku из item_data и даже не один раз, потому что вы делаете декартовое соединение этих двух таблиц без каких-либо условий. Мое предположение:

a). Использовать левое соединение или не существует, что-то вроде этого:

SELECT t1.sku FROM item_data t1 left join item_table t2 on t1.sku = t2.sku 
WHERE t2.sku IS NULL 

SELECT t1.sku FROM item_data t1 
WHERE NOT EXISTS (SELECT 1 FROM item_table t2 WHERE t1.sku = t2.sku) 

b). Проверьте, есть ли индексы в sku-поле для обеих таблиц, они будут делать эти запросы намного быстрее.

+0

Вопрос об индексе. Когда я создаю таблицу с ПК, Postgres говорит что-то по порядку «Создал неявный индекс в (columns1 .. columnsN)). Лучше ли вручную создавать индекс здесь? У меня еще не было возможности попробовать это, но я пойду дальше и выберу этот ответ. – dizzystar

+0

@dizzystar Я думаю, для запроса нет разницы, где бы ни был создан индекс вручную или нет :) – Mikhail

0

В оракула мире, вы можете попробовать МИНУС ...

INSERT INTO item_data (sku) 
    SELECT sku FROM item_table 
    MINUS 
    SELECT sku FROM item_data; 
Смежные вопросы