Доступ к данным из одной таблицы в SQL Server 2005 слишком медленный

Ниже приведен сценарий таблицы. Доступ к данным из этой таблицы слишком медленный.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Emails](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [datecreated] [datetime] NULL CONSTRAINT [DF_Emails_datecreated]  
        DEFAULT (getdate()),
    [UID] [nvarchar](250) COLLATE Latin1_General_CI_AS NULL,
    [From] [nvarchar](100) COLLATE Latin1_General_CI_AS NULL,
    [To] [nvarchar](100) COLLATE Latin1_General_CI_AS NULL,
    [Subject] [nvarchar](max) COLLATE Latin1_General_CI_AS NULL,
    [Body] [nvarchar](max) COLLATE Latin1_General_CI_AS NULL,
    [HTML] [nvarchar](max) COLLATE Latin1_General_CI_AS NULL,
    [AttachmentCount] [int] NULL,
    [Dated] [datetime] NULL
) ON [PRIMARY]

Следующий запрос занимает 50 секунд для получения данных.

select id, datecreated, UID, [From], [To], Subject, AttachmentCount, 
    Dated from emails

Если я включу Body и Html в select, то время будет хуже.

включены индексы:

  • идентификатор уникальный сгруппированный
  • Из Неуникальные не кластеризованные
  • Кому Не уникальный, не кластеризованный

Таблицы в настоящее время содержат более 180000 записей.

Каждый месяц может быть 100 000 записей, поэтому со временем это будет происходить медленнее.

Разделение данных на две таблицы решит проблему? Какие еще показатели должны быть?


person Kashif    schedule 14.06.2010    source источник
comment
Подождите минутку: для извлечения 180 тысяч записей требуется 50 секунд? Почему вы извлекаете 180K записей? Что вы с ними делаете? Почему 50 секунд это долго? Человек не может обрабатывать 180 тысяч записей на экране. Итак, мой вопрос: вам действительно нужны все записи или есть предложение WHERE, которое вы пропустили в своем примере?   -  person MJB    schedule 14.06.2010
comment
Я не думаю, что индексы будут работать, так как у вас нет предложения where. Вы выполняете полное сканирование таблицы, несмотря ни на что.   -  person Blorgbeard    schedule 14.06.2010
comment
Зачем вам нужно извлекать все записи из таблицы? Нельзя ли использовать ограничительную оговорку?   -  person pcent    schedule 14.06.2010
comment
Вы правы в том, что я пропустил предложение where, потому что я думаю, что получение этих записей должно занять от 5 до 6 секунд. Почему от 5 до 6 секунд, потому что, когда я извлекаю только «id», это занимает всего 2 секунды, так что эта разница слишком велика.   -  person Kashif    schedule 14.06.2010
comment
Считать. ПОЛУЧЕНИЕ ВСЕХ записей — это много IO — это не занимает 5-6 секунд. Предложение where абсолютно критично — прикрепите ваши данные только к тому, что вам нужно в данный момент. Извлечение по ID должно занять ОЧЕНЬ мало времени. сотые доли секунды или меньше.   -  person TomTom    schedule 14.06.2010


Ответы (1)


Почти наверняка проблема возникает из-за объема данных. Из-за этого вам не следует извлекать столбец Subject, пока он вам не понадобится. Даже получение SUBSTRING(Subject, 100) может быть заметно быстрее.

Это может быть неуместно, но старые версии SQL Server страдали, если столбцы BLOB не были последними в строке, поэтому просто в качестве эксперимента я переместил [AttachmentCount] и [Dated] выше трех столбцов nvarchar(max).

person egrunin    schedule 14.06.2010
comment
Спасибо за помощь. Я просмотрю документы SQL, чтобы проверить ваши комментарии о BLOB. - person Kashif; 14.06.2010