Changes between Version 2 and Version 5 of Ticket #25464
- Timestamp:
- Sep 27, 2015, 10:34:57 AM (9 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Ticket #25464
- Property Cc added
-
Ticket #25464 – Description
v2 v5 5 5 If 100.000 categories have type=5, then an IN clause with 100.000 Category IDs is generated to get the Item objects. Even with a custom queryset using a Prefetch() object, the IN clause is generated, even though it is A) redundant, B) sends a potentially multi-megabyte SQL statement over the wire for the database to process, C) may confuse the query planner to generate an inefficient execution plan, and D) doesn't scale: 6 6 {{{ 7 Category.objects.filter(type=5).prefetch_related(Prefetch('items', queryset=Item.objects.filter(category__ item=5)))7 Category.objects.filter(type=5).prefetch_related(Prefetch('items', queryset=Item.objects.filter(category__type=5))) 8 8 }}} 9 9 Pull request https://github.com/django/django/pull/5356 adds the possibility to skip the IN clause in cases where we are sure that a better queryset will get (at least) the same items as the IN clause would: 10 10 {{{ 11 Category.objects.filter(type=5).prefetch_related(Prefetch('items', queryset=Item.objects.filter(category__ item=5), filter_on_instances=False))11 Category.objects.filter(type=5).prefetch_related(Prefetch('items', queryset=Item.objects.filter(category__type=5), filter_on_instances=False)) 12 12 }}} 13 13 In my tests, this speeds up prefetch_related() by 20x-50x on large querysets.