sql выбрать из большого количества идентификаторов - PullRequest
3 голосов
/ 09 июня 2010

У меня есть стол, Фу. Я запускаю запрос на Foo, чтобы получить идентификаторы из подмножества Foo. Затем я хочу выполнить более сложный набор запросов, но только по этим идентификаторам. Есть ли эффективный способ сделать это? Лучшее, что я могу придумать, - это создать запрос, такой как:

SELECT ... --complicated stuff
WHERE ... --more stuff
  AND id IN (1, 2, 3, 9, 413, 4324, ..., 939393)

То есть я строю огромное предложение "IN". Это эффективно? Есть ли более эффективный способ сделать это, или это единственный способ присоединиться к исходному запросу, который получает идентификаторы? Если это помогает, я использую SQLObject для подключения к базе данных PostgreSQL, и у меня есть доступ к курсору, который выполнил запрос, чтобы получить все идентификаторы.

ОБНОВЛЕНИЕ: Я должен отметить, что все более сложные запросы либо основаны на этих идентификаторах, либо создают дополнительные идентификаторы для поиска в других запросах. Если бы мне пришлось сделать один большой запрос, я бы в итоге соединил шесть таблиц одновременно, что может быть слишком медленным.

Ответы [ 4 ]

6 голосов
/ 09 июня 2010

Одна из техник, которую я использовал в прошлом, заключалась в том, чтобы поместить идентификаторы во временную таблицу, а затем использовать ее для запуска последовательности запросов.Что-то вроде:

BEGIN;
CREATE TEMP TABLE search_result ON COMMIT DROP AS
  SELECT entity_id
  FROM entity /* long complicated search joins and conditions ... */;
-- Fetch primary entities
SELECT entity_id, entity.x /*, ... */
FROM entity JOIN search_result USING (entity_id);
-- Fetch some related entities
SELECT entity_id, related_entity_id, related_entity.x /*, ... */
FROM related_entity JOIN search_result USING (entity_id);
-- And more, as required
END;

Это особенно полезно, когда объекты результатов поиска имеют несколько отношений «один ко многим», которые вы хотите получить без а) выполнения N * M + 1 выбора или б) выполнения aдекартово соединение связанных сущностей.

1 голос
/ 09 июня 2010

Я думаю, что было бы полезно использовать VIEW. Просто создайте представление с вашим запросом для идентификаторов, а затем присоединитесь к этому представлению через идентификатор. Это ограничит ваши результаты необходимым подмножеством идентификаторов без дорогостоящего оператора IN.

Я знаю, что оператор IN дороже, чем оператор EXISTS.

0 голосов
/ 09 июня 2010

Вам почти наверняка лучше с объединением, однако другой вариант - использовать дополнительный выбор, т. Е.

SELECT ... --complicated stuff
WHERE ... --more stuff
  AND id IN (select distinct id from Foo where ...)
0 голосов
/ 09 июня 2010

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

...