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

Откуда:
Сообщений: 825
Здравствуйте.

Творится какая то мистика, смотрю план запроса, из которого вижу, что определённый индекс использует: 111229976 строк,
хотя таблица, в которой строится индекс, содержит 100946 записей.

Удалил индекс и создал его заново.
Обновил статистику (exec sp_updatestats)

В плане то же самое...
Непонимаю, откуда индекс берет 111 млн. записей?

Индекс такой:

CREATE NONCLUSTERED INDEX [ANVIZ_T_Protocol_Time] ON [dbo].[T_Protocol]
(
	[time] ASC
)
INCLUDE ( 	[objid],
	[param1],
	[objtype]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO


Сервер:
Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) Jun 17 2016 19:14:09 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
4 фев 19, 10:02    [21801058]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с индексом..  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19291
MAULER, наверное, надо показать текст запроса, DDL использованных в нём таблиц, и собственно сам план...
4 фев 19, 10:11    [21801063]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с индексом..  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29025
MAULER
Творится какая то мистика, смотрю план запроса, из которого вижу, что определённый индекс использует: 111229976 строк,
Не индекс использует, а запрос (операция по индексу) использует. Потому что сервер обращается к индексу более одного раза.
Покажите, действительно, запрос и план.
4 фев 19, 10:20    [21801070]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с индексом..  [new]
MAULER
Member

Откуда:
Сообщений: 825
alexeyvg,
запрос такой:

SELECT Office,
       Time,
	   UserName,
	   Direction,
	   SensorID,
	   nextTime,
	   DATEDIFF(ss, Time, nextTime) AS sec
  FROM (SELECT Office,
               Time,
			   UserName,
			   Direction,
			   SensorID,
			   (SELECT TOP (1) Time
				  FROM dbo.V_ShortUnionData AS t2
                 WHERE (Time > t1.Time)
				   AND (t2.Office = N'Л')
				   AND (t1.UserName = UserName)
				   AND (t1.Direction = Direction)
				   AND (t1.SensorID = SensorID)
				 ORDER BY t1.Time) AS nextTime
          FROM dbo.V_ShortUnionData AS t1) AS t
  WHERE (DATEDIFF(ss, Time, nextTime) <= 10)


А план исполнения запроса в каком виде нужен? Весь файл или достаточно фрагмента где индекс используется?
4 фев 19, 10:23    [21801072]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с индексом..  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19291
Вот знаете... создать запрос, который дважды использует таблицу V_ShortUnionData, и спрашивать, почему как-то не так используется индекс из таблицы T_Protocol - это немножко перебор...
4 фев 19, 10:56    [21801091]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с индексом..  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 926
MAULER,
учите мат.часть
+

WITH
tt AS (
  SELECT 
    [Office]    = [Office],
	  [UserName]  = [UserName],
	  [Direction] = [Direction],
	  [SensorID]  = [SensorID],
    [Time]      = [Time],
	  [NextTime]  = LEAD( [Time] ) 
                  OVER (
                    PARTITION BY
                      [Office],
                      [UserName],
                      [Direction],
                      [SensorID]
                    ORDER BY
                      [Time] )
  FROM 
    [dbo].[V_ShortUnionData]
  WHERE
    [Office] = N'Л'
)
SELECT
  *
FROM
  tt
WHERE 
  DATEDIFF( SS, [Time], [NextTime] ) <= 10

4 фев 19, 11:09    [21801102]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с индексом..  [new]
MAULER
Member

Откуда:
Сообщений: 825
Akina,
Согласен, запрос далёк от идеала, но для меня непонятно, почему с утра до вечера, один и тот же запрос выполняется за 2-3 минуты, а после 0.00 часов 20-25 мин.
4 фев 19, 11:16    [21801107]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с индексом..  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 926
MAULER
Akina,
Согласен, запрос далёк от идеала, но для меня непонятно, почему с утра до вечера, один и тот же запрос выполняется за 2-3 минуты, а после 0.00 часов 20-25 мин.

Потому что с утра он (сервер) свежий и отдохнувший, а вечером затр...ейсенный твоими запросами...
4 фев 19, 11:31    [21801121]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с индексом..  [new]
MAULER
Member

Откуда:
Сообщений: 825
Руслан Дамирович
MAULER
Akina,
Согласен, запрос далёк от идеала, но для меня непонятно, почему с утра до вечера, один и тот же запрос выполняется за 2-3 минуты, а после 0.00 часов 20-25 мин.

Потому что с утра он (сервер) свежий и отдохнувший, а вечером затр...ейсенный твоими запросами...


Мой запрос выполняется в джобе 24/7
4 фев 19, 11:37    [21801129]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с индексом..  [new]
Yasha123
Member

Откуда:
Сообщений: 1459
ну так смотрите ожидания (sys.dm_os_waiting_tasks) в момент долгого выполнения.
кто ж знает, чего он у вас ждет.
4 фев 19, 11:39    [21801131]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с индексом..  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
MAULER
Руслан Дамирович
пропущено...

Потому что с утра он (сервер) свежий и отдохнувший, а вечером затр...ейсенный твоими запросами...


Мой запрос выполняется в джобе 24/7

это пя-я-я-я-ять
4 фев 19, 11:44    [21801136]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста разобраться с индексом..  [new]
MAULER
Member

Откуда:
Сообщений: 825
Руслан Дамирович
MAULER,
учите мат.часть
+

WITH
tt AS (
  SELECT 
    [Office]    = [Office],
	  [UserName]  = [UserName],
	  [Direction] = [Direction],
	  [SensorID]  = [SensorID],
    [Time]      = [Time],
	  [NextTime]  = LEAD( [Time] ) 
                  OVER (
                    PARTITION BY
                      [Office],
                      [UserName],
                      [Direction],
                      [SensorID]
                    ORDER BY
                      [Time] )
  FROM 
    [dbo].[V_ShortUnionData]
  WHERE
    [Office] = N'Л'
)
SELECT
  *
FROM
  tt
WHERE 
  DATEDIFF( SS, [Time], [NextTime] ) <= 10



Похоже, действительно, есть чему поучиться. Спасибо Вам за запрос, отрабатывает мгновенно.
5 фев 19, 07:01    [21801675]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить