У меня есть огромный стол, чтобы работать с. Я хочу проверить, есть ли некоторые отчеты, parent_id которых равняется моей мимолетной стоимости. в настоящее время, что я осуществляю, это при помощи «избранного количества (*) от mytable где parent_id =: id»; если результат> 0, означает, что они действительно существуют.
Поскольку это - очень огромный стол, и я не забочусь о том, что точно количество отчетов, которое существует, я просто хочу знать, существует ли оно, таким образом, я думаю, что количество (*) немного неэффективно.
Как я осуществляю это требование самым быстрым способом? Я использую Oracle 10.
#
Согласно зимуют Подсказки & Уловки https://www.hibernate.org/118.html#A2
Это предлагает написать как это:
Целочисленное количество = (Целое число) session.createQuery («выбирают количество (*) из....»), .uniqueResult ();
Я не знаю то, что волшебство uniqueResult () здесь? почему это делает это быстро?
Сравните с «избранным 1 от mytable, где parent_id = passingId и rowrum <2», который более эффективен?
Обязательный запрос - это тот, кто должен идти, если вы не заинтересованы в количестве записей:
select 'Y' from dual where exists (select 1 from mytable where parent_id = :id)
Это вернет «y», если запись существует и ничего не в противном случае.
[С точки зрения вашего вопроса о «UniqueSult» «UniqueSult» Hibernate - все это вернет один объект, когда есть только один объект для возврата - вместо набора, содержащего 1 объект. Если несколько результатов возвращаются, метод бросает исключение.]
Нет реальной разницы между:
select 'y'
from dual
where exists (select 1
from child_table
where parent_key = :somevalue)
и
select 'y'
from mytable
where parent_key = :somevalue
and rownum = 1;
... По крайней мере, в Oracle10Gr2 и вверх. Умраль Oracle достаточно в этом выпуске, чтобы сделать быструю двойную операцию, где она воздействует на любую реальную активность. Второй запрос будет легче портировать, если это когда-либо рассмотрение.
На реальный показатель производительности является ли столбец Parent_key проиндексирован. Если это не так, то вы должны запустить что-то вроде:
select 'y'
from dual
where exists (select 1
from parent_able
where parent_key = :somevalue)
Прежде всего, вам нужен индекс на MyTable.Parent_id.
Это должно сделать ваш запрос достаточно быстро, даже для больших таблиц (если только нет много строк с одним и тем же Parent_id).
Если нет, вы можете написать
select 1 from mytable where parent_id = :id and rownum < 2
, который вернет бы одну строку, содержащую 1, или нет строки вообще. Не нужно подсчитать строки, просто найти один, а затем выйти. Но это специфичное Oracle SQL (из-за порошема), и вы предпочитаете не.
Для DB2 есть что-то вроде Выберите * из mytable, где parent_id =? Выберите первую 1 строку только
. Я предполагаю, что что-то подобное существует для оракула.
Выберите COUNT (*) Должен быть облегченно быстрым, если у вас есть индекс, и если вы этого не сделаете, позволяя базу данных прервать после первого матча.
Но так как вы спросили:
boolean exists = session.createQuery("select parent_id from Entity where parent_id=?")
.setParameter(...)
.setMaxResults(1)
.uniqueResult()
!= null;
(некоторые синтаксические ошибки, которые следует ожидать, поскольку у меня нет гиберната, чтобы проверить на этом компьютере)
для Oracle, MaxResults переводится в родину с помощью Hibernate.
Что касается того, что Uniqueresult () делает, прочитает его javadoc! Использование Uniqueresult вместо списка () не имеет возможности эффективности; Если я вспомню правильно, реализация UniqueResult делегаты в список ().