powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ищет по id но он не нужен для поиска
11 сообщений из 11, страница 1 из 1
Ищет по id но он не нужен для поиска
    #39679850
Дядя Коля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
представьте есть таблица
Код: 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
Ищет по id но он не нужен для поиска
    #39679851
Дядя Коля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и собственно вопрос почему он все время вроде как ищет по id?
...
Рейтинг: 0 / 0
Ищет по id но он не нужен для поиска
    #39679857
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дядя Коляну и собственно вопрос почему он все время вроде как ищет по id?Ищет - это какая операция? Иднекс скан?
Вы бы лучше план запроса выложили.
...
Рейтинг: 0 / 0
Ищет по id но он не нужен для поиска
    #39679863
Дядя Коля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот это 99% занимает
...
Рейтинг: 0 / 0
Ищет по id но он не нужен для поиска
    #39679874
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дядя Коля,

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

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

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

на полях fk_id1 и fk_id2 - индексы есть? Если нет, то чего вы хотите от сервера? единственный способ получить данные из таблицы в отсутствие индексов - это прочитать таблицу полностью. что в вашем случае, скорее всего, и происходит. Ибо скан (scan) кластерного индекса = полному чтению таблицы (потому что при наличии кластерного индекса - индекс и есть таблица).
есть
ну так недостаточно вашего индекса. И вместо того что бы SEEK NC index + LOOKUP, делает SCAN кластерного.
...
Рейтинг: 0 / 0
Ищет по id но он не нужен для поиска
    #39681854
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый оптимальный индекс для приведенного вами запроса такой:
Код: 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
Ищет по id но он не нужен для поиска
    #39681905
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Затуливетер,

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


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