2012-03-21 2 views
3

Мне нужно получить данные из нескольких таблиц, поэтому я использовал запрос с N внешними внешними соединениями. Мне кажется, что это может быть пустой тратой производительности, так как я получаю декартово произведение большого количества данных. Какой предпочтительный путь к этому для достижения большей производительности? Я собираюсь сделать N + 1 маленьких запросов. Я на правильном пути?Самый эффективный способ запроса базы данных с помощью JDBC?

Я знаю, это имеет мало общего с спецификой JDBC. Я хочу получить данные из одной таблицы и сделать левые внешние соединения для других N таблиц. Результирующий набор становится очень большим, потому что я получаю декартовой продукт. Например:

table1data1, table2data1, table3data1

table1data1, table2data2, table3data1

table1data1, table2data1, table3data2

table1data1, table2data2, table3data2

Я знаю, что если сделать несколько запросы к базе данных (например, в моем примере я получаю 1 запись для таблицы1, 2 записи для таблиц 2 и 2 записи для таблицы 2). Я сделаю много обращений к базе данных. Но я протестировал этот путь, и он выглядит намного быстрее.

+0

Это скорее зависит от того, чего вы пытаетесь достичь, но N + 1 небольших запросов почти никогда не является лучшим способом делать вещи. Можете ли вы опубликовать пример того, что у вас есть и что вы хотите выбраться? – Jaydee

+4

Внешнее соединение - это нечто ** полностью **, отличное от декартова. –

+2

Если вы получаете много продуктов из картофеля, скорее всего, ваш запрос неверен. – m0skit0

ответ

1

Это действительно не специфический JDBC. Вообще говоря, в зависимости от количества возвращаемых данных вы получите лучшую производительность, получая все в одном наборе результатов. N + 1 запросов, как правило, делают много круглых поездок в базу данных. Имеет ли набор результатов поля, которые вам не нужны? Можете ли вы обрезать возвращаемые столбцы? Это был бы первый шаг, если это было возможно.

0

Я думаю, что ваш текущий подход от получения большого количества данных за одну поездку к базе данных - это правильный подход. Однако, если вы обнаруживаете, что выполняете один и тот же запрос много раз с разными параметрами, более удобно записывать его как хранимую процедуру с использованием переменных привязки. Но я определенно уклоняюсь от разрыва вашей JOIN на несколько небольших запросов.

Смежные вопросы