Мы используем SQL Server 2005 для отслеживания количества постоянно поступающих данных (5-15 обновлений в секунду). Мы заметили, что в течение пары месяцев он был в производстве, и одна из таблиц начала запрашивать нецензурное количество запросов.
Таблица имеет 3 столбца:
-
id
- autonumber (кластеризованный) -
typeUUID
- GUID, сгенерированный перед вставкой; используется для группировки типов вместе -
typeName
- Название типа (duh...)
Один из запросов, которые мы запускаем, является отдельным в поле typeName
:
SELECT DISTINCT [typeName] FROM [types] WITH (nolock);
В поле typeName
есть некластерный, неповторимый восходящий индекс. В настоящий момент таблица содержит около 200 миллионов записей. Когда мы запускаем этот запрос, запрос возвращался 5 м 58 секунд! Возможно, мы не понимаем, как работают индексы... Но я не думал, что мы их неправильно поняли.
Чтобы проверить это немного дальше, мы выполнили следующий запрос:
SELECT DISTINCT [typeName] FROM (SELECT TOP 1000000 [typeName] FROM [types] WITH (nolock)) AS [subtbl]
Этот запрос возвращается примерно через 10 секунд, как и следовало ожидать, он просматривает таблицу.
Что-то нам здесь не хватает? Почему первый запрос занимает так много времени?
Изменить: А, мои извинения, первый запрос возвращает 76 записей, спасибо вам.
Последующие действия: Спасибо всем за ваши ответы, это имеет для меня больше смысла (я не знаю, почему этого не было раньше...). Без индекса он выполняет сканирование таблицы по 200-миллиметровым строкам с индексом, выполняет сканирование индекса по 200-м строкам...
SQL Server предпочитает индекс, и он дает немного повышения производительности, но нечего волноваться. Восстановление индекса заняло время запроса до чуть более 3 м вместо 6 м, улучшение, но недостаточно. Я просто рекомендую моему начальству, что мы нормализуем структуру таблицы.
Еще раз спасибо вам за вашу помощь!