2010-06-18 4 views

ответ

8

Неограниченная запрос один, где критерии поиска не особенно конкретными, и, таким образом, скорее всего, вернется очень большой набор результатов. Запрос без предложения 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

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 не обеспечивает хороший способ подкачки через коллекцию при перемещении графа объектов. Рекомендуется, чтобы вы выписали отдельный и явный запрос для содержимого коллекции, что позволит вам просматривать эту коллекцию, не загружая слишком много данных в память.

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