SQL Server 15MM строк, простой запрос COUNT. 15+ секунд? - PullRequest
1 голос
/ 09 апреля 2010

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

У нас есть таблица, которая увеличивается примерно на 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 ]

3 голосов
/ 09 апреля 2010

Если вам нужно количество строк, но вы можете жить с приблизительным значением (не на 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 сек.)

1 голос
/ 09 апреля 2010

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

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

0 голосов
/ 09 апреля 2010

15 million строк, работающих на SQL Server 2005 Express

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

...