Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ищет по id но он не нужен для поиска / 11 сообщений из 11, страница 1 из 1
26.07.2018, 19:26
    #39679850
Дядя Коля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ищет по id но он не нужен для поиска
представьте есть таблица
Код: sql
1.
2.
3.
id
fk_id1
fk_id2



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

запрос примерно такого вида
Код: sql
1.
select fk_id1, fk_id2 from table where fk_id1 = 1 and fk_id2 = 2
...
Рейтинг: 0 / 0
26.07.2018, 19:27
    #39679851
Дядя Коля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ищет по id но он не нужен для поиска
ну и собственно вопрос почему он все время вроде как ищет по id?
...
Рейтинг: 0 / 0
26.07.2018, 19:41
    #39679857
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ищет по id но он не нужен для поиска
Дядя Коляну и собственно вопрос почему он все время вроде как ищет по id?Ищет - это какая операция? Иднекс скан?
Вы бы лучше план запроса выложили.
...
Рейтинг: 0 / 0
26.07.2018, 20:02
    #39679863
Дядя Коля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ищет по id но он не нужен для поиска
ну вот это 99% занимает
...
Рейтинг: 0 / 0
26.07.2018, 20:48
    #39679874
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ищет по id но он не нужен для поиска
Дядя Коля,

на полях fk_id1 и fk_id2 - индексы есть? Если нет, то чего вы хотите от сервера? единственный способ получить данные из таблицы в отсутствие индексов - это прочитать таблицу полностью. что в вашем случае, скорее всего, и происходит. Ибо скан (scan) кластерного индекса = полному чтению таблицы (потому что при наличии кластерного индекса - индекс и есть таблица).
...
Рейтинг: 0 / 0
26.07.2018, 23:17
    #39679936
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ищет по id но он не нужен для поиска
Дядя Коляну вот это 99% занимает

Запрос "примерный", план картинками, про таблицы и индексы ничего неизвестно...
Так диагноз не поставить.
Скорее всего, раз у вас поиск по кластерному индексу, значит, по одному из полей есть индекс, ну а для получения второго поля нужно лезть в кластерный. Как то так.
лечится созданием индекса на fk_id1 и fk_id2. Но может не помочь, запрос то "примерный".
...
Рейтинг: 0 / 0
26.07.2018, 23:18
    #39679937
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ищет по id но он не нужен для поиска
Щукина Аннана полях fk_id1 и fk_id2 - индексы есть? Если нет, то чего вы хотите от сервера?Если бы не было, то был бы скан по кластерному индексу. А тут поиск.
...
Рейтинг: 0 / 0
27.07.2018, 13:34
    #39680195
Дядя Коля
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ищет по id но он не нужен для поиска
Щукина АннаДядя Коля,

на полях fk_id1 и fk_id2 - индексы есть? Если нет, то чего вы хотите от сервера? единственный способ получить данные из таблицы в отсутствие индексов - это прочитать таблицу полностью. что в вашем случае, скорее всего, и происходит. Ибо скан (scan) кластерного индекса = полному чтению таблицы (потому что при наличии кластерного индекса - индекс и есть таблица).
есть
...
Рейтинг: 0 / 0
27.07.2018, 13:37
    #39680199
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ищет по id но он не нужен для поиска
Дядя КоляЩукина АннаДядя Коля,

на полях fk_id1 и fk_id2 - индексы есть? Если нет, то чего вы хотите от сервера? единственный способ получить данные из таблицы в отсутствие индексов - это прочитать таблицу полностью. что в вашем случае, скорее всего, и происходит. Ибо скан (scan) кластерного индекса = полному чтению таблицы (потому что при наличии кластерного индекса - индекс и есть таблица).
есть
ну так недостаточно вашего индекса. И вместо того что бы SEEK NC index + LOOKUP, делает SCAN кластерного.
...
Рейтинг: 0 / 0
01.08.2018, 09:25
    #39681854
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ищет по id но он не нужен для поиска
Самый оптимальный индекс для приведенного вами запроса такой:
Код: sql
1.
2.
create index IDX_TableName_id1_id2
on dbo.TableName ( fk_id1, fk_id2 ) 



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



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



Имейте в видду что включение больльшого кол-ва полей в индекс увеличивает его размеры.
Если получается так что вам надо включить почти все поля таблицы, подумайте о том чтобы поменять кластреный индекс, сделайте его по полям fk_id1, fk_id2. Но вам надо учитывать другие запросы к этой таблице, проведите анализ прежде чем делать эти изменения.
...
Рейтинг: 0 / 0
01.08.2018, 11:30
    #39681905
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ищет по id но он не нужен для поиска
Владимир Затуливетер,

авторЕсли получается так что вам надо включить почти все поля таблицы, подумайте о том чтобы поменять кластреный индекс, сделайте его по полям fk_id1, fk_id2. Но вам надо учитывать другие запросы к этой таблице, проведите анализ прежде чем делать эти изменения.
действительно, делать кластер по FK, да ещё и по двум это очень правильно
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ищет по id но он не нужен для поиска / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]