Вы не упомянули свою базу данных. Если это не SQL Server, особенности получения данных могут отличаться, но в основном это тот же совет.
Обязательно посмотрите на индексирование, но в первую очередь следуйте советам Blorgbeard и сканируйте планы выполнения с помощью Management Studio (опять же, если вы используете SQL Server).
Я предполагаю, что вы увидите, что для небольших диапазонов дат оптимизатор выбирает разумный план запроса, но когда диапазон дат большой, он выбирает что-то совершенно иное, вероятно, включающее либо сканирование таблицы, либо сканирование индекса и, возможно, объединения, которые приводят к очень большим временным наборам записей. Анализатор плана выполнения покажет все это.
Сканирование означает, что оптимизатор считает, что просмотр всей таблицы или всего индекса дешевле того, что вы пытаетесь сделать, чем поиск конкретных значений.
То, что вы в конечном итоге захотите сделать, - это получить индексы и синтаксис вашего запроса, настроенный таким образом, чтобы вы сохраняли поиск индекса в плане запроса для вашего запроса независимо от диапазона дат, или, если это не удалось, то требуемые сканы отфильтрованный, а также вы можете минимизировать размер временного набора записей и тем самым избежать чрезмерного чтения и ввода-вывода.