счетчик остановок на заданном пороге - PullRequest
1 голос
/ 29 марта 2011

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

В большинстве случаев это нормально, но в некоторых отчетах содержится более миллиона результатов, это означает, что для получения результата требуется несколько секунд.

В идеале, я бы хотел поместить мой порог (2000) в свой оператор sql, остановить счетчик, если он достигнет этого значения, и вернуть некоторое значение (например, true или false, 0 или 1, что угодно), чтобы Я знаю, что он превысил свой предел. Возможно ли это в SQL, пока я не могу найти решение.

Псевдокод: выберите количество (1) из таблицы, в то время как количество <= порог </p>

Я работаю с Java, Hibernate, SQL Server 2005.

Любая помощь будет высоко ценится.

С уважением,

Имон

Ответы [ 4 ]

1 голос
/ 29 марта 2011

Я думаю, что-то вроде этого должно работать:

select count(1) from (
  select top 2000 *
    from table
   where ...
)
1 голос
/ 29 марта 2011

Мне не нравится идея выполнить запрос дважды, один раз, чтобы проверить количество строк, а затем снова, чтобы фактически получить данные.В результате, если вы хотите ограничить отчет до 2000 строк, просто сделайте что-то вроде этого:

SELECT TOP 2001
  ...
  from...

в приложении проверьте, больше ли количество строк, чем ваш предел >2000, верните ошибку илипропустить его отображение.

0 голосов
/ 29 марта 2011

Я на самом деле не знаю эквивалента в инструкции Hibernate для TOP, но даже если он существует сначала, вам придется извлечь 2000 строк, а затем посчитать их, что, вероятно, будет медленным, как сейчас. Таким образом, вы можете запустить строку allredy 2001, а затем подтвердить ее в приложении.

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

SELECT count(*) from test1 inner join test2 on test1.id = test2.id;

888 мс

SELECT count(test.id) from test1 inner join test2 on test1.id = test2.id;

88ms

отношение 35 строк в test1 соответствует 1 в test2;

строки 1252080;

0 голосов
/ 29 марта 2011

попробовать что-то вроде предельного предложения? На этой странице показано, как это можно сделать на сервере SQL: http://blogs.msdn.com/b/sqlserver/archive/2006/10/25/limit-in-sql-server.aspx

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