Тут два фактора (Говорим про 64bit системы).
Во-первых это кол-во не должно превышать максимальное возможное число типа size_t, то есть MAX_SIZE (18446744073709551615). Так как указатели на объекты состоят из 8 байт (А мы знает что создать число в обход Py_Object нельзя), то размер не должен превышать MAX_SIZE / 8, т.е. 2305843009213693951
Тут еще чтоит учесть сколько у вас физической оперативной памяти.
Список из 500 000 000 элементов None (a = [None] * 500000000) Занимает уже 4 гигабайта, реальной, физической памяти.
ps -aux | grep python
USER PID %MEM RSS COMMAND
ro 4039 51.8 3990584 python3
То есть, чтобы уместить 2305843009213693951 элементов, только на указатели вы потратите 16 экзабайт. Плюс вам надо учесть, что сами объекты тоже занимают память.
Плюс надо учесть, что памяти у системы питон забирает немногим больше, чем вы указали, примерно по такой формуле (new_allocated += (newsize >> 3) + (newsize < 9 ? 3 : 6);).
Во-вторых. SQL эквивалент - SELECT ... WHERE id IN (el1, el2, ... );
То есть зависит от используемой БД и максимального кол-ва елементов в конструкции IN.
Вот это допустим для MySQL
В целом, скорее упрётесь в лимит БД.
Сумбурненько, но, я думаю, понятно.