Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Индексы и Like (Часть вторая :) )  [new]
Seb
Guest
Совсем недавно данная тема поднималась, но все же...
Очень рассчитываю на Вашу помощь!

Имеем таблицу Table1 (5-6 млн.записей).
Поля :
ID int,Field1 varchar(50),Field2 varchar(50),Field3 varchar(50)/

ID-Primary key.
Построен составной индекс по полям Field1..Field3. (назовем его Indx_F1)

При поиске:
select *
from Table1
where Field1='Иванов'
В плане выполнения запроса видим, что индекс используется.

При поиске:
select *
from Table1
where Field1 like ('Иванов%')
В плане выполнения запроса видим, что индекс НЕ используется,
а происходит сканирование всей таблицы !!!!!

При принудительном "подталкивании" индекса:
select *
from Table1 (index(Indx_F1))
where Field1 like ('Иванов%')
сервер уходит а полный даун

Данная ситуация ставит меня в полный тупик.
29 мар 04, 14:35    [601993]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
Glory
Member

Откуда:
Сообщений: 104760
????

select Field1, Field2, Field3

from Table1
where Field1 like ('Иванов%')
29 мар 04, 14:40    [602006]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
YellowMan
Member

Откуда: острова
Сообщений: 1047
У меня используется - и у соседа тоже используется...и дома тоже используется.
Может у Вас в таблице все Ивановы, кроме парочки Петровых ? Это я про распределение намекаю...
29 мар 04, 14:59    [602062]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
Seb
Guest
Для YellowMan
по поводу выборочности:

В таблице 5,5 млн. записей.
'Ивановых' - 100000записей (это максимум).

Но такая ситуация повторяется даже если
вместо 'Иванова' - 'Чубайс' (что согласитесь гороаздо меньше)
29 мар 04, 15:02    [602071]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А можно обозреть планы обоих запросов (да и по запросу от Glory тоже надо план).
29 мар 04, 15:13    [602103]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
Seb
Guest
Для tpg:
В каком виде?
29 мар 04, 15:20    [602117]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
Glory
Member

Откуда:
Сообщений: 104760
SET SHOWPLAN_TEXT ON 

GO
select * from Table1 where Field1 like ('Иванов%')
go

select Field1, Field2, Field3 from Table1 where Field1 like ('Иванов%')
go

select Field1 from Table1 where Field1 like ('Иванов%')

SET SHOWPLAN_TEXT OFF
GO
29 мар 04, 15:22    [602122]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
rst
Member

Откуда: Йобурк
Сообщений: 1005
Построен составной индекс

Составной слабо поможет если по первому полю будет используется like 'x%'

Может быть проблема и в collations..
Стоит попробовать точно привести..

select * from m1tmp..sc104 where descr like cast('Иванов%' COLLATE CollateТаблицы as varchar(50))
29 мар 04, 15:25    [602133]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
Seb
Guest
 select top 20 *  from tbMRP_PhPerson  where  (FIO Like('Иванов%'))  order by SysNumber


|--Top(20)

|--Clustered Index Scan(OBJECT:([Cronos2].[dbo].[tbMRP_PhPerson].[PK_tbMRP_PhP]), WHERE:(like([tbMRP_PhPerson].[FIO], 'Иванов%', NULL)) ORDERED FORWARD)


select top 20 Fio,Adress,Status  from tbMRP_PhPerson  where  (FIO Like('Иванов%'))  order by SysNumber

|--Top(20)

|--Clustered Index Scan(OBJECT:([Cronos2].[dbo].[tbMRP_PhPerson].[PK_tbMRP_PhP]), WHERE:(like([tbMRP_PhPerson].[FIO], 'Иванов%', NULL)) ORDERED FORWARD)



select top 20 Fio from tbMRP_PhPerson  where  (FIO Like('Иванов%'))  order by SysNumber

|--Sort(TOP 20, ORDER BY:([tbMRP_PhPerson].[SysNumber] ASC))

|--Index Seek(OBJECT:([Cronos2].[dbo].[tbMRP_PhPerson].[Indx_tbPhPerson_FIO]), SEEK:([tbMRP_PhPerson].[FIO] >= 'Иванов' AND [tbMRP_PhPerson].[FIO] < 'ИваноЃ'), WHERE:(like([tbMRP_PhPerson].[FIO], 'Иванов%', NULL)) ORDERED FORWARD)


(в последнем случае индекс используется)
29 мар 04, 15:33    [602146]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
Glory
Member

Откуда:
Сообщений: 104760
Здорово - а откуда вдруг взялись TOP 20 и ORDER BY SysNumber.
Причем SysNumber я так понимю ни в какие индексы не включен
29 мар 04, 15:36    [602152]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
Seb
Guest
SysNumber - IDик таблицы (Primary key)
TOP 20 - что бы не тащить Все записи
29 мар 04, 15:39    [602163]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
AlexeyChik
Guest
А если откинуть ORDER BY, что нить поменяется?
Сдается мне, что в двух первых случаях серваку легче скан кластерного индекса сделать, без сортировки, т.к. выбирается меньше полей.
Короче, без ORDER by какой план?
29 мар 04, 16:07    [602272]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
Seb
Guest
select top 20 * from tbMRP_PhPerson where (FIO Like('Иванов%'))
|--Top(20)
|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([Cronos2].[dbo].[tbMRP_PhPerson]))
|--Index Seek(OBJECT:([Cronos2].[dbo].[tbMRP_PhPerson].[Indx_tbPhPerson_FIO1]), SEEK:([tbMRP_PhPerson].[FIO] >= 'Иванов' AND [tbMRP_PhPerson].[FIO] < 'ИваноЃ'), WHERE:(like([tbMRP_PhPerson].[FIO], 'Иванов%', NULL)) ORDERED FORWARD)

н-да....
а отказаться от сортировки не могу
29 мар 04, 16:18    [602309]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
автор
н-да....
а отказаться от сортировки не могу

Ну и заверни его в подзапрос

select * from

(select top 20 * from tbMRP_PhPerson where FIO Like 'Иванов%')
order by SysNumber
29 мар 04, 16:36    [602365]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
Alexes
Member

Откуда:
Сообщений: 1100
Наверняка автору темы нужно 20 первых по значению SysNumber записей.
Иначе зачем ему их сортировать? :)
29 мар 04, 16:42    [602377]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
автор
Наверняка автору темы нужно 20 первых по значению SysNumber записей.

Вот тут

https://www.sql.ru/forum/actualpost.aspx?bid=1&tid=83353&mid=0&p=1#602163

он однозначно упоминает, что

автор
TOP 20 - что бы не тащить Все записи
29 мар 04, 16:44    [602388]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
Seb
Guest
Top 20 нужно для того, что бы пользователь
не получал сразу ВСЕ записи (из может быть сколь-угодно много),
а частями (в дан. случае по 20).

т.е. первый запрос:

select Top 20 *
from ....
where ...
order by Sysnumber

второй и последующие:

select Top 20 *
from ....
where ...
and SysNumber > (последний показанный)
order by Sysnumber
29 мар 04, 16:47    [602396]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
AlexeyChik
Guest
автор
Ну и заверни его в подзапрос

Снова мне сдается, что не обманешь оптимизатор. Будет делать скан..
29 мар 04, 16:47    [602397]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А какой индекс по SysNumber? Кластерный или нет?
29 мар 04, 16:54    [602415]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
Seb
Guest
SysNumber - кластерный
29 мар 04, 16:55    [602418]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А по FIO индекс собственно по колонке или составной?
29 мар 04, 16:57    [602423]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
Seb
Guest
Изначально FIO был составной по трем полям.
Создал еще Fio1 - по одному полю.
29 мар 04, 17:04    [602441]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
автор
Создал еще Fio1 - по одному полю.

Приведи план с order by...
29 мар 04, 17:06    [602448]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
Seb
Guest
Причем, если:

select top 20 * from tbMRP_PhPerson (index(Indx_tbPhPerson_FIO))
where
(FIO Like('Иванов%'))
and
(Adress Like('г.Москва, Лен%'))
order by SysNumber

все без проблем - летает.

если:
select top 20 * from tbMRP_PhPerson (index(Indx_tbPhPerson_FIO))
where
(FIO Like('Иванов%'))
order by SysNumber

сервак уходит надолго в себя.

Если:

select top 20 * from tbMRP_PhPerson
where
(FIO Like('Иванов%'))
and
(Adress Like('г.Москва, Лен%'))
order by SysNumber

сервер цепляет только индекс по полю Adress.
29 мар 04, 17:08    [602455]     Ответить | Цитировать Сообщить модератору
 Re: Индексы и Like (Часть вторая :) )  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
автор
если:
select top 20 * from tbMRP_PhPerson (index(Indx_tbPhPerson_FIO))
where
(FIO Like('Иванов%'))
order by SysNumber

сервак уходит надолго в себя.

А если просто?

select top 20 * from tbMRP_PhPerson

where
(FIO Like('Иванов%'))
order by SysNumber
29 мар 04, 17:11    [602469]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить