Будет ли запрос на обновление SQL с использованием предложения WHERE IN, содержащий потенциально много идентификаторов строк, которые не будут совпадать, быть проблемой производительности? - PullRequest
1 голос
/ 26 марта 2012

У меня есть список неактивных_продуктов в файле XML.Мне нужно обновить «активное» (булево) поле продуктов, имеющихся в БД, на основе списка неактивных продуктов.Тем не менее, список неактивных продуктов содержит много продуктов, которых нет даже в моей БД.Будет ли быстрее просто выполнить оператор UPDATE, используя предложение WHERE IN со всем списком неактивных продуктов, или я должен сначала сравнить список неактивных продуктов с файлом активных продуктов CSV, чтобы получить соответствующие неактивные продукты, а затемвместо этого выполнить инструкцию UPDATE со всем этим отфильтрованным списком?

Моя первоначальная мысль состоит в том, что я должен просто позволить SQL сделать свое дело и обработать нефильтрованный список, но каков технически правильный ответ?

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Один из способов обойти длинный список значений оператора IN - вместо этого ПРИСОЕДИНИТЬСЯ к временной таблице. Это был обходной путь, когда Oracle не поддерживал более 1000 значений для IN.

Если у вас есть такой запрос

SELECT * FROM mytable WHERE column IN (value1, value2, ..., valueN)

затем замените его на:

CREATE TEMPORARY TABLE temp_table AS
SELECT column FROM <source that contains value1, value2, ..., valueN>

SELECT * FROM mytable JOIN temp_table ON (mytable.column = temp_table.column)

Асимптотически это должно работать лучше, чем при использовании IN (по крайней мере, в Oracle).

1 голос
/ 26 марта 2012

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

Если это становится слишком медленным, тогда вы можете сначала посмотреть на фильтрацию списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...