2010-08-25 39 views
20

Bạn có biết đó là phương pháp tốt nhất để tìm nạp khối kết quả từ truy vấn không?Google App Engine: Con trỏ so sánh Offset

1.Cursor

q = Person.all() 
last_cursor = memcache.get('person_cursor') 
if last_cursor: 
    q.with_cursor(last_cursor) 
people = q.fetch(100) 
cursor = q.cursor() 
memcache.set('person_cursor', cursor) 

2.Offset

q = Person.all() 
offset = memcache.get('offset') 
if not offset: 
    offset = 0 
people = q.fetch(100, offset = offset) 
memcache.set('offset', offset + 100) 

Đọc Google documentation, có vẻ như con trỏ không thêm overhead của một truy vấn bù đắp.

+1

Thật thú vị khi thấy một số phép đo về điều này :) – svrist

Trả lời

29

Mặc dù khó đo lường chính xác và đáng tin cậy, tôi sẽ ngạc nhiên nếu con trỏ không chạy vòng quanh phương pháp bù trừ ngay khi tập hợp các thực thể Person đủ lớn đang được trả về. Dưới dạng the docs nói rất rõ ràng và rõ ràng,

Kho dữ liệu tìm nạp bù trừ + giới hạn kết quả cho ứng dụng. Kết quả bù trừ đầu tiên không bị bỏ qua bởi chính kho dữ liệu .

Phương thức fetch() bỏ qua kết quả bù trừ đầu tiên, sau đó trả về phần còn lại (kết quả giới hạn).

Truy vấn có hiệu suất các đặc điểm tương ứng tuyến tính với số tiền chênh lệch cộng với giới hạn.

Tôi không chắc chắn làm thế nào nó có thể là bất kỳ rõ ràng hơn: O (bù đắp + Hạn) là lớn-O thực hiện lấy với một bù đắp. Nếu tổng thể (nói trên nhiều tác vụ được lập biểu) bạn đang tìm nạp một triệu mục, 1000 tại một thời điểm, khi bạn tìm nạp 1000 cuối cùng (với bù đắp 999000) kho dữ liệu không không bỏ qua 999000 đầu tiên (mặc dù tìm nạp không trả về chúng), vì vậy tác động hiệu suất sẽ đáng kinh ngạc.

Không có báo trước như vậy áp dụng cho việc sử dụng con trỏ: tìm nạp lại chính xác vị trí đã dừng, mà không phải tìm nạp lại tất cả (có thể nhiều) mục đã tìm nạp cùng con trỏ đó trong truy vấn trước đó. Do đó, với hiệu suất O (giới hạn), thời gian trôi qua sẽ tốt hơn tùy ý bạn có thể có được với bù trừ, miễn là bù đắp đó đủ lớn.

+0

Bạn sẽ xem xét điều gì là "tập hợp các thực thể Person đủ lớn"? 1.000? 10.000? 100.000? Cảm ơn! – JK140