Мы используем SQL Server 2005 для отслеживания достаточного количества постоянно поступающих данных (5-15 обновлений в секунду). Мы заметили, что после того, как он работал в течение нескольких месяцев, одной из таблиц потребовалось неприличное количество времени для запроса.
Таблица имеет 3 столбца:
id
- автономный номер (кластерный)
typeUUID
- GUID, сгенерированный до вставки; используется для группировки типов
typeName
- Имя типа (дух ...)
Один из запросов, которые мы выполняем, отличается от поля 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 записей, спасибо ninesided.
Продолжение: Спасибо всем за ваши ответы, теперь это имеет больше смысла для меня (я не знаю, почему раньше не было ...) Без индекса выполняется сканирование таблицы по 200 миллионам строк, по индексу выполняется сканирование индекса по 200 миллионам строк ...
SQL Server предпочитает индекс, и он немного повышает производительность, но не о чем беспокоиться. Восстановление индекса сократило время запроса до 3 м вместо 6 м, что является улучшением, но этого недостаточно. Я просто порекомендую своему боссу, чтобы мы нормализовали структуру таблицы.
Еще раз спасибо всем за помощь !!