2010-06-18 22 views

Trả lời

8

Một truy vấn không giới hạn là một trong những nơi mà các tiêu chí tìm kiếm không phải là đặc biệt cụ thể, và do đó có khả năng trả về một tập kết quả rất lớn. Một truy vấn không có mệnh đề WHERE chắc chắn sẽ rơi vào thể loại này, nhưng chúng ta hãy xem xét một chút về một số khả năng khác. Hãy nói rằng chúng tôi có bảng như sau:

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...); 

Giả sử chúng ta muốn kéo trong một giao dịch cụ thể, và chúng tôi biết ID của bán:

SELECT * FROM SALES_DATA WHERE ID_SALES_DATA = <whatever> 

Trong trường hợp này các truy vấn được bao bọc, và chúng tôi có thể đảm bảo nó sẽ kéo theo một hoặc một số hàng.

Ví dụ khác về truy vấn bị chặn, nhưng với tập hợp kết quả lớn sẽ là sản phẩm được tạo ra khi giám đốc quận 23 nói "Tôi muốn xem tổng doanh thu cho mỗi cửa hàng ở quận của tôi cho mỗi ngày vào năm ngoái", mà sẽ là một cái gì đó giống như

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) 

Trong trường hợp này truy vấn sẽ trả lại 365 hàng hoặc ít hơn, nếu cửa hàng không mở mỗi ngày) cho mỗi cửa hàng ở quận 23. Nếu có 25 cửa hàng trong quận, nó sẽ trả về 9125 hàng hoặc ít hơn.

Mặt khác, giả sử VP bán hàng của chúng tôi muốn có một số dữ liệu. Anh/cô ấy/nó không phải là khá chắc chắn những gì muốn, nhưng anh/cô ấy/nó là khá chắc chắn rằng bất cứ điều gì nó đã xảy ra trong sáu tháng đầu năm ... không hoàn toàn chắc chắn về năm ... và không chắc chắn về địa điểm, hoặc là - có lẽ ở quận 23 (anh/cô ấy/cô ấy/cô ấy đã có một mối thù hận với cá nhân chạy quận 23 trong 6 năm qua, kể từ khi giải golf đó ... tốt, đừng bận tâm. .. nhưng nếu một vấn đề có thể được treo trên cánh cửa của giám đốc quận 23 để được nó!) ... và tất nhiên anh/cô ấy/nó muốn tất cả các chi tiết, và có nó trên/cô/bàn của mình thổi còi ngọt ngào! Và do đó chúng tôi nhận được một truy vấn trông giống như

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 

Đây là ví dụ về truy vấn không bị chặn. Có bao nhiêu hàng sẽ trở lại? Câu hỏi hay - điều đó tùy thuộc vào điều kiện kinh doanh, số lượng vị trí đã mở, bao nhiêu ngày trong tháng 2, v.v.

Đặt đơn giản hơn, nếu bạn có thể xem truy vấn và có ý tưởng hay về cách nhiều hàng sẽ trả về (mặc dù con số đó có thể tương đối lớn) truy vấn bị ràng buộc. Nếu bạn không thể, nó không bị chặn.

Chia sẻ và thưởng thức.

0

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

Một kết quả thiết lập vô biên là nơi một truy vấn được thực hiện và không hạn chế một cách rõ ràng số lượng kết quả trả về từ một truy vấn. Thông thường, điều này có nghĩa là ứng dụng giả định rằng một truy vấn sẽ luôn trả về chỉ một vài bản ghi. Điều đó hoạt động tốt trong phát triển và trong thử nghiệm, nhưng nó là một quả bom thời gian chờ đợi để phát nổ trong sản xuất.

Truy vấn có thể đột ngột bắt đầu trả hàng nghìn hàng nghìn hàng và trong một số trường hợp, nó có thể trả về hàng triệu hàng. Điều này dẫn đến tải nhiều hơn trên máy chủ cơ sở dữ liệu, máy chủ ứng dụng và mạng. Trong nhiều trường hợp, nó có thể làm cho toàn bộ hệ thống dừng lại, thường kết thúc với các máy chủ ứng dụng gặp sự cố do lỗi bộ nhớ.

Dưới đây là một ví dụ về một truy vấn mà sẽ kích hoạt không giới hạn cảnh báo kết quả thiết lập:

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

Nếu hạng mục biểu diễn có nhiều bài viết, chúng ta sẽ tải tất cả trong số họ, mà có lẽ không phải những gì đã dự định. Điều này có thể được cố định khá dễ dàng bằng cách sử dụng pagination bằng cách sử dụng Take) phương pháp (:

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

Bây giờ chúng ta yên tâm rằng chúng ta chỉ cần xử lý một dự đoán, tập kết quả nhỏ, và nếu chúng ta cần phải làm việc với tất cả các chúng, chúng ta có thể trang qua các bản ghi khi cần thiết. Phân trang được thực hiện bằng cách sử dụng phương thức Skip(), hướng dẫn Entity Framework bỏ qua (ở cấp độ cơ sở dữ liệu) N số bản ghi trước khi thực hiện trang tiếp theo.

Nhưng có một lỗi thường xảy ra trong những kết quả vô biên thiết lập vấn đề từ trực tiếp đi qua đồ thị đối tượng, như trong ví dụ sau:

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

Ở đây, một lần nữa, chúng tôi đang tải toàn bộ tập mà không quan tâm như thế nào lớn tập kết quả có thể được. Entity Framework không cung cấp cách phân trang tốt thông qua một bộ sưu tập khi duyệt qua biểu đồ đối tượng. Chúng tôi khuyên bạn nên phát hành truy vấn riêng biệt và rõ ràng cho nội dung của bộ sưu tập, cho phép bạn trang qua bộ sưu tập đó mà không tải quá nhiều dữ liệu vào bộ nhớ.

Các vấn đề liên quan