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

Откуда: Київ
Сообщений: 10428
План показывает, что запрос использует не самый подходящий индекс, из-за этого

select-nested loops
-index seek (parent_id) 30%
-key lookup(clustered) 70%

Сделал один в один тестовую таблицу+такие же точно индексы

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[n333]') AND type in (N'U'))
	DROP TABLE [dbo].[n333]
GO

CREATE TABLE [dbo].[n333](
	[id] [uniqueidentifier] NOT NULL,
	[checked] [int] NOT NULL DEFAULT (0),
	[parent_id] [uniqueidentifier] NOT NULL,
	[type] [int] NOT NULL,
 CONSTRAINT [PK_n333] PRIMARY KEY CLUSTERED ([id] ASC))
GO
CREATE NONCLUSTERED INDEX [IX_n333_parent_id] ON [dbo].[n333]
([parent_id] ASC)
GO

CREATE NONCLUSTERED INDEX [IX_n333_type_checked] ON [dbo].[n333]
(
	[checked] ASC,
	[type] ASC,
	[parent_id] ASC
)
GO



insert into n333([id], [parent_id],[type], [checked])
select '06B6CE99-DA4E-4D94-84ED-C41A5D3192B6', '06B6CE99-DA4E-4D94-84ED-C41A5D3192B6', 1, 0
union all
select '24898F83-4F37-47A8-8775-7D754807857C', '06B6CE99-DA4E-4D94-84ED-C41A5D3192B6', 1, 0
union all
select '24898F83-4F37-47A8-8775-7D754807857D', '06B6CE99-DA4E-4D94-84ED-C41A5D3192B6', 2, 0
union all
select '24898F83-4F37-47A8-8775-7D754807857E', '06B6CE99-DA4E-4D94-84ED-C41A5D3192B6', 2, 0
union all
select '06B6CE99-DA4E-4D94-84ED-C41A5D319201', '24898F83-4F37-47A8-8775-7D754807857C', 1, 0
union all
select '06B6CE99-DA4E-4D94-84ED-C41A5D319202', '24898F83-4F37-47A8-8775-7D754807857C', 1, 0
union all
select '06B6CE99-DA4E-4D94-84ED-C41A5D319203', '24898F83-4F37-47A8-8775-7D754807857C', 4, 1
union all
select '06B6CE99-DA4E-4D94-84ED-C41A5D319204', '24898F83-4F37-47A8-8775-7D754807857C', 4, 0
union all
select '06B6CE99-DA4E-4D94-84ED-C41A5D319205', '24898F83-4F37-47A8-8775-7D754807857C', 5, 0
union all
select '06B6CE99-DA4E-4D94-84ED-C41A5D319206', '24898F83-4F37-47A8-8775-7D754807857C', 5, 1
union all
select '06B6CE99-DA4E-4D94-84ED-C41A5D319207', '24898F83-4F37-47A8-8775-7D754807857C', 6, 0
union all
select '06B6CE99-DA4E-4D94-84ED-C41A5D319208', '24898F83-4F37-47A8-8775-7D754807857C', 7, 0
GO

SELECT checked, type, parent_id,id FROM dbo.n333
WHERE checked=0
and type<>21
and parent_id='24898F83-4F37-47A8-8775-7D754807857C'	



и точно такой же запрос дает

select-Index seek(nonclustered) [IX_n333_type_checked] 100%

т.е. то, что надо.


Как заставить запрос на основной таблице использовать нужный индекс?
13 июн 13, 13:08    [14427822]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует подходящий индекс  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
непонятно...

указал на основной таблице запросу насильно индекс

SELECT checked, type, parent_id,id FROM dbo.n_x3  WITH (INDEX(IX_n_x3_c_t_p))
WHERE checked=0
and type<>21
and parent_id=@parent_id


Сработал, дал план

select-Parallelism 1%-Index Seek(nonClustered) 99%

И выдал рекомендацию по пропущенному индексу

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[n_x3] ([checked],[parent_id],[type])


Так что - удалить существующий и создать рекомендуемый с таким порядком полей?
13 июн 13, 13:22    [14427894]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует подходящий индекс  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
непонятно...

Как раз все понятно.
В другой таблице наверное много больше записей
И поэтому type<>21 вовсе не располагает к поиску по индексу
Потому что type<>21 это на самом деле type< 21 OR type > 21
13 июн 13, 13:26    [14427923]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует подходящий индекс  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
непонятно...

Как раз все понятно.
В другой таблице наверное много больше записей
И поэтому type<>21 вовсе не располагает к поиску по индексу
Потому что type<>21 это на самом деле type< 21 OR type > 21


ясно, да, там намного больше запсией, не учел, спасибо.
13 июн 13, 13:31    [14427945]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует подходящий индекс  [new]
Crimean
Member

Откуда:
Сообщений: 13147
имхо вполне логично что для запроса

WHERE checked=0
and type<>21
and parent_id=@parent_id

индекс ([checked],[parent_id],[type]) подходит сильно лучше чем индекс ([checked],[type],[parent_id])!
возможно, стоит вообще parent_id поставить первым полем - но тут на распределение данных стоит глянуть
13 июн 13, 13:32    [14427952]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует подходящий индекс  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Crimean
имхо вполне логично что для запроса

WHERE checked=0
and type<>21
and parent_id=@parent_id

индекс ([checked],[parent_id],[type]) подходит сильно лучше чем индекс ([checked],[type],[parent_id])!
возможно, стоит вообще parent_id поставить первым полем - но тут на распределение данных стоит глянуть


там сильно разреженные значения checked(0-10, но в основном 0, 1), и type (пара десятков уникальных значений) в таблице с миллионами записей.....
в том то и дело, мне надо бы индекс создавать не в конкретной базе, а ткскыть общее решение, и потом отдать разным юзерам хотфикс для разных баз....
13 июн 13, 13:37    [14428006]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует подходящий индекс  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Winnipuh
там сильно разреженные значения checked(0-10, но в основном 0, 1), и type (пара десятков уникальных значений) в таблице с миллионами записей.....


ну тогда почему парента первым не поставить?
13 июн 13, 14:37    [14428511]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует подходящий индекс  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Crimean
Winnipuh
там сильно разреженные значения checked(0-10, но в основном 0, 1), и type (пара десятков уникальных значений) в таблице с миллионами записей.....


ну тогда почему парента первым не поставить?


хмм... попробую сейчас, кстати...
13 июн 13, 15:00    [14428845]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не использует подходящий индекс  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Crimean
Winnipuh
там сильно разреженные значения checked(0-10, но в основном 0, 1), и type (пара десятков уникальных значений) в таблице с миллионами записей.....


ну тогда почему парента первым не поставить?
А потому что в производительности никакой разницы не будет. С чего бы вдруг? И никак это не зависит от распределения данных.
13 июн 13, 23:48    [14431133]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить