Самый быстрый способ проверить, если некоторые отчеты в таблицу базы данных?

У меня есть огромный стол, чтобы работать с. Я хочу проверить, есть ли некоторые отчеты, 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», который более эффективен?

10
задан Sawyer 25 January 2010 в 09:36
поделиться

5 ответов

Обязательный запрос - это тот, кто должен идти, если вы не заинтересованы в количестве записей:

select 'Y' from dual where exists (select 1 from mytable where parent_id = :id)

Это вернет «y», если запись существует и ничего не в противном случае.

[С точки зрения вашего вопроса о «UniqueSult» «UniqueSult» Hibernate - все это вернет один объект, когда есть только один объект для возврата - вместо набора, содержащего 1 объект. Если несколько результатов возвращаются, метод бросает исключение.]

11
ответ дан 3 December 2019 в 17:58
поделиться

Нет реальной разницы между:

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)
4
ответ дан 3 December 2019 в 17:58
поделиться

Прежде всего, вам нужен индекс на MyTable.Parent_id.

Это должно сделать ваш запрос достаточно быстро, даже для больших таблиц (если только нет много строк с одним и тем же Parent_id).

Если нет, вы можете написать

select 1 from mytable where parent_id = :id and rownum < 2

, который вернет бы одну строку, содержащую 1, или нет строки вообще. Не нужно подсчитать строки, просто найти один, а затем выйти. Но это специфичное Oracle SQL (из-за порошема), и вы предпочитаете не.

2
ответ дан 3 December 2019 в 17:58
поделиться

Для DB2 есть что-то вроде Выберите * из mytable, где parent_id =? Выберите первую 1 строку только . Я предполагаю, что что-то подобное существует для оракула.

0
ответ дан 3 December 2019 в 17:58
поделиться

Выберите 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 делегаты в список ().

5
ответ дан 3 December 2019 в 17:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: