Создать кластерный индекс и / или разбиение на неуникальный столбец? - PullRequest
2 голосов
/ 31 августа 2011

У меня есть таблица, содержащая записи журнала за одну неделю для примерно тысячи веб-серверов.Каждый сервер записывает в таблицу около 60 000 записей в день, поэтому для каждого сервера в неделю создается 420 000 записей.Таблица усекается еженедельно.Каждая запись в журнале содержит имя сервера, которое является varchar (это нельзя изменить).

Основная операция - select * from table where servername = 'particular', чтобы получить 420 000 записей для сервера, а затем программа C # анализируетданные с этого сервера когда-то были выбраны.

Должен ли я создать кластеризованный индекс в столбце servername для ускорения операции чтения?(В настоящее время выполнение вышеуказанного оператора SQL занимает более получаса.)

Поможет ли разбиение?На компьютере есть только два физических диска.

Запрос выполняется для каждого сервера один раз в неделю.После выполнения запроса для всех серверов таблица усекается.

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

на основе:

Запрос выполняется для каждого сервера один раз в неделю. После запуска запроса для всех серверов таблица усекается.

и

около тысячи веб-серверов

Я бы изменил программу на c #, чтобы просто выполнить один запрос один раз:

select * from table Order By servername,CreateDate

и он обрабатывает "взлом" при изменении имени сервера.

Одно сканирование таблицы лучше, чем 1000. Я не стал бы замедлять ВСТАВКИ основного приложения в таблицу журналов (с кластеризованным индексом), чтобы ваши запросы раз в неделю выполнялись быстрее.

2 голосов
/ 31 августа 2011

«Стандартный» идеальный кластеризованный ключ - это что-то вроде INT IDENTITY, который продолжает увеличиваться и становится узким.

Однако, если ваше основное использование для этой таблицы - перечисленный запрос, тогда я думаю, что кластеризованный индексна servername имеет смысл.Вы увидите значительное увеличение скорости, если таблица будет большой, так как вы исключите дорогой поиск ключа / закладки, который выполняется на SELECT * из некластеризованного индекса (если вы не include все поля в таблице).

РЕДАКТИРОВАТЬ:

КМ указал, что это будет замедлять вставки, и это правда.Для этого сценария вы можете рассмотреть ключ с двумя полями на servername, idfield, где idfield - это INT Identity.Это по-прежнему будет разрешать доступ только на основе servername в вашем запросе, но будет вставлять новые записи в конце PER SERVER .У вас все еще будет фрагментация и переупорядочение.

0 голосов
/ 31 августа 2011

Да, было бы неплохо создать столбец clustered index на servername, поскольку теперь базе данных необходимо выполнить сканирование таблицы, чтобы выяснить, какие записи удовлетворяют критериям servername = 'specific'.

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

Затем убедитесь, что вы запускаете запросы на основе даты:

SELECT * FROM table
WHERE date BETWEEN '20110801' AND '20110808'
      AND servername = 'particular'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...