У меня есть следующий запрос:
SELECT COUNT(Id) FROM Table
Таблица содержит 33 миллиона записей - она содержит первичный ключ для идентификатора и никаких других индексов.
Запрос занимает 30 секунд.
Фактический план выполнения показывает, что он использует сканирование кластерного индекса.
Мы проанализировали таблицу и обнаружили, что она не фрагментирована с использованием первого запроса, показанного по этой ссылке: http://sqlserverpedia.com/wiki/Index_Maintenance.
Любые идеи относительно того, почему этот запрос такой медленный и как его исправить.
Определение таблицы:
CREATE TABLE [dbo].[DbConversation](
[ConversationID] [int] IDENTITY(1,1) NOT NULL,
[ConversationGroupID] [int] NOT NULL,
[InsideIP] [uniqueidentifier] NOT NULL,
[OutsideIP] [uniqueidentifier] NOT NULL,
[ServerPort] [int] NOT NULL,
[BytesOutbound] [bigint] NOT NULL,
[BytesInbound] [bigint] NOT NULL,
[ServerOutside] [bit] NOT NULL,
[LastFlowTime] [datetime] NOT NULL,
[LastClientPort] [int] NOT NULL,
[Protocol] [tinyint] NOT NULL,
[TypeOfService] [tinyint] NOT NULL,
CONSTRAINT [PK_Conversation_1] PRIMARY KEY CLUSTERED
(
[ConversationID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Одна вещь, которую я заметил, - база данных настроена нарастут на 1 Мб.
Это живая система, поэтому мы ограничились тем, с чем мы можем играть - есть идеи?
ОБНОВЛЕНИЕ:
ОК - мы улучшили производительность вактуальный интересный запрос путем добавления новых некластеризованных индексов в соответствующие столбцы, так что это больше не является критической проблемой.
SELECT COUNT
все еще медленный - пробовал его с подсказками NOLOCK - без разницы.
Мы все думаем, что это как-то связано с тДля Autogrowth установлено значение 1Mb, а не большее число, но он удивлен, что это имеет такой эффект.Может ли фрагментация MDF на диске быть возможной причиной?