Могу ли я спросить, какие типы данных находятся в вашей таблице? Кроме того, какой тип машины вы используете?
Не похоже, чтобы что-то складывалось. Я придумал некоторые тестовые данные и выполнил запрос выше, и запрос выполняется почти мгновенно, даже при работе с maxdop 1
.
Вот мой тест данные:
create table dbo.tbl (
intCol int,
varcharCol varchar(128),
datetimeCol datetime);
insert tbl (
intCol,
varcharCol,
datetimeCol)
select top (6000000)
abs(checksum(newid())) % 100,
abs(checksum(newid())) % 100,
convert(datetime, abs(checksum(newid())) % 50000)
from sys.all_columns a
cross join sys.all_columns b;
create nonclustered index uc
on tbl (intCol, varcharCol, datetimeCol);
Ниже вы можете выбрать любую комбинацию цифр, пока они находятся в пределах области допустимых значений, и вы почти гарантированные матчи, так как размер данных набор является существенным.
declare
@intval int = 50,
@varchr varchar(128) = '55',
@from datetime = '1900-01-01',
@to datetime = '1950-01-01';
set nocount on;
set statistics io on;
set statistics time on;
select count(*) -- select *
from tbl
where intCol = @intval
and varcharCol = @varchr
and datetimeCol between @from and @to
option (maxdop 1);
set statistics time off;
set statistics io off;
Результаты показывают, что время выполнения - это de minimis.
-----------
221
Table 'tbl'. Scan count 1, logical reads 5, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Кроме того, план запроса, который я вижу, аналогичен тому, что вы упомянули в своем оригинальном посте. Это типичный план выполнения и стоимость простого запроса с агрегированием и предложением where.
Рассмотрим индексированных View http://aboutsqlserver.com/2011/03/24/indexed-materialized-views-in-microsoft-sql-server/ – Bas
Сначала вы могли бы попытаться поставить индекс на один ** непустой номер ** 'int' (что-то вроде вашего ** первичного ключа ** -' ID' или что-то еще). Поскольку это всего лишь один 4-байтовый 'int', индекс будет требовать меньше страниц для чтения только для определения количества строк. Или вы можете использовать представления системного каталога, чтобы получить ** приблизительный ** подсчет строки в вашей таблице. –
В зависимости от вашей версии SQL Server вы также можете рассмотреть индекс хранилища столбцов, который бы помог, особенно учитывая, что часть диапазона дат Ваш запрос. –