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

Откуда:
Сообщений: 132
представьте есть таблица
id
fk_id1
fk_id2


составляется запрос который зависит от fk_id1 и fk_id2 и никак не зависит от id, на котором кластерный индекс. В плане же пишется что 95% времени занимает поиск по кластерному индексу id

запрос примерно такого вида
select fk_id1, fk_id2 from table where fk_id1 = 1 and fk_id2 = 2
26 июл 18, 19:26    [21605928]     Ответить | Цитировать Сообщить модератору
 Re: Ищет по id но он не нужен для поиска  [new]
Дядя Коля
Member

Откуда:
Сообщений: 132
ну и собственно вопрос почему он все время вроде как ищет по id?
26 июл 18, 19:27    [21605930]     Ответить | Цитировать Сообщить модератору
 Re: Ищет по id но он не нужен для поиска  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30821
Дядя Коля
ну и собственно вопрос почему он все время вроде как ищет по id?
Ищет - это какая операция? Иднекс скан?
Вы бы лучше план запроса выложили.
26 июл 18, 19:41    [21605970]     Ответить | Цитировать Сообщить модератору
 Re: Ищет по id но он не нужен для поиска  [new]
Дядя Коля
Member

Откуда:
Сообщений: 132
ну вот это 99% занимает

К сообщению приложен файл. Размер - 3Kb
26 июл 18, 20:02    [21606005]     Ответить | Цитировать Сообщить модератору
 Re: Ищет по id но он не нужен для поиска  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
Дядя Коля,

на полях fk_id1 и fk_id2 - индексы есть? Если нет, то чего вы хотите от сервера? единственный способ получить данные из таблицы в отсутствие индексов - это прочитать таблицу полностью. что в вашем случае, скорее всего, и происходит. Ибо скан (scan) кластерного индекса = полному чтению таблицы (потому что при наличии кластерного индекса - индекс и есть таблица).
26 июл 18, 20:48    [21606102]     Ответить | Цитировать Сообщить модератору
 Re: Ищет по id но он не нужен для поиска  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30821
Дядя Коля
ну вот это 99% занимает

Картинка с другого сайта.
Запрос "примерный", план картинками, про таблицы и индексы ничего неизвестно...
Так диагноз не поставить.
Скорее всего, раз у вас поиск по кластерному индексу, значит, по одному из полей есть индекс, ну а для получения второго поля нужно лезть в кластерный. Как то так.
лечится созданием индекса на fk_id1 и fk_id2. Но может не помочь, запрос то "примерный".
26 июл 18, 23:17    [21606502]     Ответить | Цитировать Сообщить модератору
 Re: Ищет по id но он не нужен для поиска  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30821
Щукина Анна
на полях fk_id1 и fk_id2 - индексы есть? Если нет, то чего вы хотите от сервера?
Если бы не было, то был бы скан по кластерному индексу. А тут поиск.
26 июл 18, 23:18    [21606505]     Ответить | Цитировать Сообщить модератору
 Re: Ищет по id но он не нужен для поиска  [new]
Дядя Коля
Member

Откуда:
Сообщений: 132
Щукина Анна
Дядя Коля,

на полях fk_id1 и fk_id2 - индексы есть? Если нет, то чего вы хотите от сервера? единственный способ получить данные из таблицы в отсутствие индексов - это прочитать таблицу полностью. что в вашем случае, скорее всего, и происходит. Ибо скан (scan) кластерного индекса = полному чтению таблицы (потому что при наличии кластерного индекса - индекс и есть таблица).

есть
27 июл 18, 13:34    [21608191]     Ответить | Цитировать Сообщить модератору
 Re: Ищет по id но он не нужен для поиска  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Дядя Коля
Щукина Анна
Дядя Коля,

на полях fk_id1 и fk_id2 - индексы есть? Если нет, то чего вы хотите от сервера? единственный способ получить данные из таблицы в отсутствие индексов - это прочитать таблицу полностью. что в вашем случае, скорее всего, и происходит. Ибо скан (scan) кластерного индекса = полному чтению таблицы (потому что при наличии кластерного индекса - индекс и есть таблица).

есть

ну так недостаточно вашего индекса. И вместо того что бы SEEK NC index + LOOKUP, делает SCAN кластерного.
27 июл 18, 13:37    [21608213]     Ответить | Цитировать Сообщить модератору
 Re: Ищет по id но он не нужен для поиска  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Самый оптимальный индекс для приведенного вами запроса такой:
create index IDX_TableName_id1_id2
on dbo.TableName ( fk_id1, fk_id2 ) 


Но скорее всего вы не два столбца выбираете а больше:
select fk_id1, fk_id2, col1, col2, col3 ... from table where fk_id1 = 1 and fk_id2 = 2


Поэтому вам нужен индекс с включенными столбцами, чтобы небыло поиска в кластерном индексе.
create index IDX_TableName_id1_id2
on dbo.TableName ( fk_id1, fk_id2 )
include ( col1, col2, col3 ... ) 


Имейте в видду что включение больльшого кол-ва полей в индекс увеличивает его размеры.
Если получается так что вам надо включить почти все поля таблицы, подумайте о том чтобы поменять кластреный индекс, сделайте его по полям fk_id1, fk_id2. Но вам надо учитывать другие запросы к этой таблице, проведите анализ прежде чем делать эти изменения.
1 авг 18, 09:25    [21620001]     Ответить | Цитировать Сообщить модератору
 Re: Ищет по id но он не нужен для поиска  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Владимир Затуливетер,

автор
Если получается так что вам надо включить почти все поля таблицы, подумайте о том чтобы поменять кластреный индекс, сделайте его по полям fk_id1, fk_id2. Но вам надо учитывать другие запросы к этой таблице, проведите анализ прежде чем делать эти изменения.

действительно, делать кластер по FK, да ещё и по двум это очень правильно
1 авг 18, 11:30    [21620580]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить