Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблема с индексом  [new]
Beltar
Member

Откуда:
Сообщений: 214
MS SQL 2008R2

Есть большая и активно растущая БД с таблицами двух типов:
1) Id, Время, Значение
2) Id, Время, Вход1,..., Вход22
Таблицы 2 не только шире, но и записей в них заносится в 2.5-5 раз больше.

С некоторых пор первые таблицы разрослись до размера, что время выборки стало непреемлемым. Посмотрев, я увидел, что индексов там нет, сделал индексы по времени для нескольких штук, но на производительности это никак не отразилось. Сейчас возникла идиотская ситуация, что таблицы второго типа работают раз в 10 быстрее, чем таблицы первого.

Для простейших запросов я получил такие планы выполнения:

Select * From dbo.ДанныеHerbert7_Вход1 /*Тип 1*/
Where Время Between '2014.06.14' and '2014.06.15'


Select <-- Параллелизм (Gather Streams) <-- Сканирование по первичному ключу. Все это сопровождается глупостью вида, что отсутствует индекс по времени. Хотя Menegment Studio прекрасно показывает его наличие и в дереве объектов, и в проекте таблицы.

Select * From dbo.ДанныеNRM19 /*Тип 2*/
Where Время Between '2014.06.14' and '2014.06.15'

А здесь все правильно, план предполагает сканирование по индексу по времени и все работает прекрасно.
Ситуация становится еще интереснее от того, что при каких-то непонятных условиях индекс может быть проигнорирован и для таких таблиц, причем если проблема проявляется, то проявляется для конкретной таблицы на конкретном компьютере.

Что можно сделать по этому поводу?
22 июн 14, 21:18    [16203351]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Beltar
Что можно сделать по этому поводу?
Привести структуры обеих таблиц и нормальные планы выполнения, а не их вольный пересказ.
22 июн 14, 21:51    [16203463]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом  [new]
Beltar
Member

Откуда:
Сообщений: 214
Планы вот. Структура примитивная, впрочем, вот скрипты.

/****** Object: Table [dbo].[ДанныеHerbert7_Вход1] */
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[ДанныеHerbert7_Вход1](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Время] [datetime] NOT NULL,
[Значение] [real] NOT NULL,
CONSTRAINT [PK_ДанныеHerbert7_Вход1] PRIMARY KEY CLUSTERED
(
[Id] 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


/****** Object: Table [dbo].[ДанныеNRM19] */
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[ДанныеNRM19](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Время] [datetime] NOT NULL,
[Вход1] [real] NOT NULL,
[Вход2] [real] NOT NULL,
[Вход3] [real] NOT NULL,
[Вход4] [real] NOT NULL,
[вход5] [real] NOT NULL,
[Вход6] [real] NOT NULL,
[Вход7] [real] NOT NULL,
[Вход8] [real] NOT NULL,
[Вход9] [real] NOT NULL,
[Вход10] [real] NOT NULL,
[Вход11] [real] NOT NULL,
[Вход12] [real] NOT NULL,
[Вход13] [real] NOT NULL,
[Вход14] [real] NOT NULL,
[вход15] [real] NOT NULL,
[Вход16] [real] NOT NULL,
[Вход17] [real] NOT NULL,
[Вход18] [real] NOT NULL,
[Вход19] [real] NOT NULL,
[Вход20] [real] NOT NULL,
[Вход21] [real] NOT NULL,
[Вход22] [real] NOT NULL,
CONSTRAINT [PK_ДанныеNRM19] PRIMARY KEY CLUSTERED
(
[Id] 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

К сообщению приложен файл (sql_plan.rar - 3Kb) cкачать
22 июн 14, 22:23    [16203590]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
Beltar,

А скрипты индексов где?
22 июн 14, 22:29    [16203617]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
Beltar
MS SQL 2008R2

Есть большая и активно растущая БД с таблицами двух типов:
1) Id, Время, Значение
2) Id, Время, Вход1,..., Вход22
Таблицы 2 не только шире, но и записей в них заносится в 2.5-5 раз больше.

С некоторых пор первые таблицы разрослись до размера, что время выборки стало непреемлемым. Посмотрев, я увидел, что индексов там нет, сделал индексы по времени для нескольких штук, но на производительности это никак не отразилось. Сейчас возникла идиотская ситуация, что таблицы второго типа работают раз в 10 быстрее, чем таблицы первого.

Про скрипты индексов - присоединяюсь: надо выложить.
Запросы действительно должны возвращать все колонки? Если нет, избавляйтесь от select * и указывайте колонки явно. И засуньте их в INCLUDE, чтоб не было KEY LOOKUP (данные будет смотреть только в индексе).

Beltar
Select <-- Параллелизм (Gather Streams) <-- Сканирование по первичному ключу. Все это сопровождается глупостью вида, что отсутствует индекс по времени. Хотя Menegment Studio прекрасно показывает его наличие и в дереве объектов, и в проекте таблицы.

Попробуйте OPTION (MAXDOP 1) ради эксперимента - я думаю, будет INDEX SEEK. Возможно скуль решил, что параллельное сканирование в данном случае будет быстрее. А решить он так мог, например, из-за неактуальной статистики. А статистику надо периодически обновлять.
23 июн 14, 01:12    [16204181]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с индексом  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
автор
здесь все правильно, план предполагает сканирование по индекс


Что же правильного в том, что происходит сканирование? Ваш индекс не покрывает запрос, т.е. он неправильный.
23 июн 14, 12:03    [16205610]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить