Что такое неограниченный запрос? - PullRequest
7 голосов
/ 18 июня 2010

Это запрос без оператора 'WHERE param = value'?

Извинения за простоту этого ...

Ответы [ 2 ]

8 голосов
/ 18 июня 2010

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

CREATE TABLE SALES_DATA
  (ID_SALES_DATA      NUMBER PRIMARY KEY,
   TRANSACTION_DATE   DATE NOT NULL
   LOCATION           NUMBER NOT NULL,
   TOTAL_SALE_AMOUNT  NUMBER NOT NULL,
   ...etc...);

CREATE TABLE LOCATION
  (LOCATION  NUMBER PRIMARY KEY,
   DISTRICT  NUMBER NOT NULL,
   ...etc...);

Предположим, что мы хотим получить определенную транзакцию, и мы знаем идентификатор продажи:

SELECT * FROM SALES_DATA WHERE ID_SALES_DATA = <whatever>

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

Другим примером ограниченного запроса, но с большим набором результатов, будет тот, который получен, когда директор округа 23 говорит: «Я хочу видеть общие продажи для каждого магазина в моем округе за каждый день в прошлом году», что будет что-то вроде

SELECT LOCATION, TRUNC(TRANSACTION_DATE), SUM(TOTAL_SALE_AMOUNT)
  FROM SALES_DATA S,
       LOCATION L
  WHERE S.TRANSACTION_DATE BETWEEN '01-JAN-2009' AND '31-DEC-2009' AND
        L.LOCATION = S.LOCATION AND
        L.DISTRICT = 23
  GROUP BY LOCATION,
           TRUNC(TRANSACTION_DATE)
  ORDER BY LOCATION,
           TRUNC(TRANSACTION_DATE)

В этом случае запрос должен возвращать 365 (или меньше, если магазины открыты не каждый день) для каждого магазина в районе 23. Если в округе 25 магазинов, он вернет 9125 строк или меньше.

С другой стороны, скажем, наш вице-президент по продажам хочет получить некоторые данные. Он / она / он не совсем уверен, чего хотел, но он / она / он вполне уверен, что что бы то ни было произошло в первые шесть месяцев года ... не совсем уверен насчет того года ... и не уверен насчет местоположения - вероятно, в округе 23 (у него / нее / нее была вражда с человеком, который управляет округом 23 в течение последних 6 лет, начиная с того турнира по гольфу, где ... хорошо не берите в голову ... но если проблема может быть повешена на двери директора района 23, пусть будет так!) ... и, конечно, он / она / она хочет все детали, и иметь его на своем / ее / ее Письменный стол сладкий! И, таким образом, мы получаем запрос, который выглядит примерно так:

SELECT L.DISTRICT, S.LOCATION, S.TRANSACTION_DATE,
       S.something, S.something_else, S.some_more_stuff
  FROM SALES_DATA S,
       LOCATIONS L
  WHERE EXTRACT(MONTH FROM S.TRANSACTION_DATE) <= 6 AND
        L.LOCATION = S.LOCATION
  ORDER BY L.DISTRICT,
           S.LOCATION

Это пример неограниченного запроса. Сколько строк он вернет? Хороший вопрос - это зависит от того, каковы были условия бизнеса, сколько мест было открыто, сколько дней было в феврале и т. Д.

Проще говоря, если вы можете посмотреть на запрос и довольно хорошо представить, сколько строк оно собирается вернуть (даже если это число может быть относительно большим), запрос ограничен. Если вы не можете, это неограниченно.

Делись и наслаждайся.

0 голосов
/ 11 сентября 2017

http://hibernatingrhinos.com/Products/EFProf/learn#UnboundedResultSet

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

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

Вот один пример запроса, который вызовет предупреждение о неограниченном наборе результатов:

var query = from post in blogDataContext.Posts
            where post.Category == "Performance"
            select post;

Если в категории производительности много постов, мы собираемся загрузить их все, что, вероятно, не то, что предполагалось.Это можно довольно легко исправить с помощью разбиения на страницы с помощью метода Take ():

var query = (from post in blogDataContext.Posts            
            where post.Category == "Performance"            
            select post)
            .Take(15);

Теперь мы уверены, что нам нужно обрабатывать только предсказуемый небольшой набор результатов, и если нам нужно работать свсе они, мы можем просматривать записи по мере необходимости.Пейджинг реализован с помощью метода Skip (), который инструктирует Entity Framework пропустить (на уровне базы данных) N записей до перехода на следующую страницу.

Но существует еще одно частое возникновение проблемы неограниченного набора результатовот непосредственного обхода графа объекта, как в следующем примере:

var post = postRepository.Get(id);
foreach (var comment in post.Comments)
{
    // do something interesting with the comment
}

Здесь мы снова загружаем весь набор без учета того, насколько большим может быть набор результатов.Entity Framework не обеспечивает хороший способ пролистывания коллекции при обходе графа объектов.Рекомендуется выполнить отдельный и явный запрос для содержимого коллекции, что позволит вам пролистывать эту коллекцию, не загружая слишком много данных в память.

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