Оказывается, что выполнение запроса типа "SELECT (a, b, c) FROM
foo ГДЕ date1 <= d AND date2> e AND name = f "занимает 0,05 секунды.
это для моих 1,7-м строк заняло бы 24 часа вычислительного времени. Мой хакер
подход со словарями был примерно на 3 порядка быстрее
эта конкретная задача (и, в этом примере, я не мог ввести дату1
и date2, очевидно, поэтому я получал каждую строку, которая соответствует имени и
затем фильтрация по дате).
Вы на самом деле попробовали и заметили, что это заняло 24 часа? Время обработки не обязательно прямо пропорционально размеру данных.
И вы предлагаете запустить SELECT (a, b, c) FROM foo WHERE date1<=d AND date2>e AND name=f
1,7 миллиона раз? Вам нужно только запустить его один раз, и он вернет все подмножество строк, соответствующих вашему запросу.
1,7 миллиона строк - это не мало, но, конечно, это не проблема для базы данных, полностью хранящейся в памяти на вашем локальном компьютере. (Нет медленного доступа к диску; нет медленного доступа к сети.)
Доказательство в пудинге. Для меня это довольно быстро (большую часть времени тратится на генерацию ~ 10 миллионов случайных чисел.)
import sqlite3, random
conn = sqlite3.connect(":memory:")
conn.execute("CREATE TABLE numbers (a FLOAT, b FLOAT, c FLOAT, d FLOAT, e FLOAT, f FLOAT)");
for _ in xrange(1700000):
data = [ random.random() for _ in xrange(6) ];
conn.execute("INSERT INTO numbers VALUES (?,?,?,?,?,?)", data)
conn.commit()
print "done generating random numbers"
results = conn.execute("SELECT * FROM numbers WHERE a > 0.5 AND b < 0.5")
accumulator = 0
for row in results:
accumulator += row[0]
print ("Sum of column `a` where a > 0.5 and b < 0.5 is %f" % accumulator)
Редактировать: Хорошо, так что вам действительно нужно выполнить это 1,7 миллиона раз.
В этом случае вам, вероятно, понадобится index . Процитирую Википедию: Индекс базы данных:
Индекс базы данных - это структура данных, которая улучшает скорость передачи данных.
операции поиска в таблице базы данных за счет более медленных записей
и увеличенное место для хранения. Индексы могут быть созданы с использованием одного или нескольких
столбцы таблицы базы данных, обеспечивая основу для быстрого случайного
поиск и эффективный доступ к заказанным записям.
Вы бы сделали что-то вроде CREATE INDEX dates_and_name ON foo(date1,date2,name)
, а затем (как мне кажется) выполнили бы остальные ваши SELECT
операторы как обычно. Попробуйте и посмотрите, не ускоряет ли это процесс.