SQL Server 15MM строк, простой запрос COUNT. 15+ секунд?

Мы перешли на сайт другой компании после того, как клиент решил переключиться.

У нас есть таблица, которая увеличивается примерно на 25 тысяч записей в день, и в настоящее время она составляет 15 миллионов записей.

Стол выглядит примерно так:

id (PK, int, not null)
member_id (int, not null)
another_id (int, not null)
date (datetime, not null)

SELECT COUNT(id) FROM tbl может занять до 15 секунд.

Простое внутреннее объединение 'another_id' занимает более 30 секунд.

Я не могу себе представить, почему это так долго. Любой совет?

SQL Server 2005 Express

3 ответа

Решение

Обратите внимание, что COUNT(id) обычно приводит к полному сканированию таблицы, поэтому для получения количества необходимо прочитать всю таблицу. Если подсчет действительно очень важен для вас, вы можете рассмотреть возможность создания триггера для сохранения результатов подсчета в другой таблице.

Без запроса я не могу много сказать о inner join, но я думаю, что у вас нет индекса либо id или же another_id

Если вам нужно количество строк, но вы можете жить с приблизительным значением (не на 100% гарантированно точным, но с приблизительным значением), вы можете использовать представления системного каталога в SQL Server, чтобы добиться этого следующим образом:

SELECT 
    t.Name AS TableName,
    sum(p.rows) as RowCounts
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
WHERE 
    t.Name = 'Your Table Name'
    i.OBJECT_ID > 255 AND   
    i.index_id <= 1
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name 

Для любой таблицы в вашей базе данных это даст вам приблизительное количество строк в этой таблице, и это очень очень быстро (не поддается измерению - менее 0,01 сек.)

15 million бегущие строки SQL Server 2005 Express

какое оборудование вы используете? ваша база данных может быть настроена правильно, но если вы не находитесь на хорошем выделенном сервере с большим количеством оперативной памяти, запросы к такой большой таблице будут медленными.

Другие вопросы по тегам