2015-06-17 4 views
0

У меня вопрос, связанный с производительностью запросов Netezza. У меня есть 2 таблицы. Таблица A и таблица B и таблица B - это поднабор таблицы A с изменением данных. Мне нужно обновить эти новые значения до таблица а из таблицы B Мы можем иметь 2 подхода здесьnetezza left external join query performance

1) Левый внешнее соединение и выберите соответствующие столбцы и вставить в целевой таблице

2) вставьте таблицу с данными в целевую таблицу и обновить эти значения из TableB с помощью join

Я пробовал и то и другое, и логически оба они одинаковы.But Explain plan is дает разную стоимость

для нормального выбора

а) Sub-query Scan table "TM2" (cost=0.1..1480374.0 rows=8 width=4864 conf=100)

обновления

б) Hash Join (cost=356.5..424.5 rows=2158 width=27308 conf=21)

для левого внешнего соединения

Sub-query Scan table "TM2" (cost=51.0..101474.8 rows=10000000 width=4864 conf=100) 

От этого я чувствую левое внешнее соединение лучше. Можно ли поставить некоторые мысли об этом и руководство

Благодарности

+0

Можете ли вы пояснить, что такое «целевой стол»? Из ваших первых нескольких утверждений, похоже, вы пытаетесь обновить некоторую таблицу A из некоторых значений таблицы B. Это так? Если это так, ваши две опции не эквивалентны. Вы говорите о чистой вставке в варианте 1 и вставке и обновлении (которое является как вставкой, так и удалением) в опции 2. Очевидно, что вариант 2 будет стоить дороже. –

+0

Было бы также полезно понять приблизительное количество строк и столбцов распределения каждой таблицы. – ScottMcG

+0

Привет всем, В обоих случаях нам нужно вставить в таблицу целей. В таблице первого случая левая внешняя таблица соединений b и вставка в таблицу c. Второй случай прямая вставка из таблицы a в таблицу c и обновление с помощью таблицы B. Упование теперь понятно. Если не считать строк, мы не можем нарисовать строку. Таблица B будет подмножеством таблицы A и макс no строк в худшем случае (10 миллионов), так как Insert содержит Group BY, а таблица фильтров C не будет пересекать 1 миллион данных. –

ответ

0

Причина, по которой стоимость insert into table_c select ... from table_a; update table_c set ... from table_b; выше, потому что вы вставки, удаления, а затем вставить. Обновления в Netezza отмечают записи, которые необходимо обновить как удаленные, а затем вставляют новые строки с обновленными значениями. Как только данные записываются до некоторой степени, это никогда (насколько мне известно) не изменилось.

С insert into table_c select ... from table_a join table_b using (...); вы вставляете только один раз, тем самым только обновляя все карты зон один раз. Стоимость будет заметно ниже.

Netezza отлично справляется с тем, чтобы держать вас подальше от диска при чтении, но он будет записывать на диск так часто, как вы его рассказываете. В случае обновлений, похоже, больше. Старайтесь писать так часто, как это необходимо для получения преимуществ от новых распределений и совместного размещения. Более того, вы просто используете избыточные действия.

+0

Спасибо за ответ. Я разместил заголовок плана запроса только потому, что нормальный выбор показал большую стоимость (таблица запроса подпрограммы «TM2» (стоимость = 0.1..1480374.0 rows = 8 width = 4864 conf = 100)) по сравнению с левым внешним соединением (таблица сканирования подпроцесса «TM2» (стоимость = 51.0..101474.8 rows = 10000000 width = 4864 conf = 100)). Я не смотрю на стоимость правильно. Исправьте меня, если я ошибаюсь –