С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10

Включать ли Primary Key вторым полем (или в Include) для других индексов

26.08.2024, 15:27. Показов 525. Ответов 12

Студворк — интернет-сервис помощи студентам
Приветствую!
Давно мучает вопрос, но тестами как-то долго проверять. Прошу совета на опыте.

Итак, есть таблица tbl с 20ю полями.
Первое из них: ID Int Identity(1, 1) Primary Key
Мне нужно отбирать по многим полям этой таблицы, но по одному за раз и, при этом, получать данные других полей.

Я собираюсь для каждого из полей отбора сделать индекс с этим одним полем, но не хочу включать все остальные поля в Include.
Вместо этого я думаю включить ID вторым полем в каждый индекс или включить его в Include, чтобы потом по нему, как по кластерному индексу получить значения любых полей.

Что скажете? Как лучше сделать в этом случае?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.08.2024, 15:27
Ответы с готовыми решениями:

Отследить исключение Primary Или Unique key
Есть таблица. В ней первичный ключ и уникальный ключ. Когда я в делфи добавляю запись, в которой уникальный ключ повторяет значение,...

Violation of Primary key constraint 'PK_otdel'. Cannot insert dupllicate key in object 'dbo.otdel'.
void __fastcall TAddOtdForm::AddOtdButton1Click(TObject *Sender) { int kodotd; MainForm->OtdelADOQuery1->Last(); kodotd =...

Работает ли CONSTRAINT для PRIMARY KEY?
Всем привет! То ли я дурак, то ли лыжи не едут… Не могу понять можно ли дать какое-то название для первичного ключа в MySQL? Нахожу примеры...

12
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
26.08.2024, 15:40
Цитата Сообщение от Jack Famous Посмотреть сообщение
Вместо этого я думаю включить ID вторым полем в каждый индекс или включить его в Include, чтобы потом по нему, как по кластерному индексу получить значения любых полей.
Что скажете? Как лучше сделать в этом случае?
Если ID помимо PK является кластерным, то значение кластерного ключа будет включено в любой индекс by design --> в этом случае добавлять/включать ID не надо
1
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
26.08.2024, 15:58  [ТС]
PaulWist, слышал о подобном, но не находил подтверждения. Да — ПК у меня всегда кластерные.
Как я понял:
1. Кластерный ПК один на таблицу и хранит её в отсортированном по полям ключа виде. Ключ уникален (это одно или несколько полей). ПК видит все поля таблицы.
2. Любой другой индекс "видит" ПК.

Но это же не означает, что любой индекс по ПК может вернуть поля без сканирования…
Хочется уйти от сканирования таблицы.

То есть, есть поле "вес" и мне нужно отобрать все строки, где "вес" = 20. Поля "марка", "город", например.
ПК видит всё. Индекс по весу может быстро отобрать строки с "вес" = 20. Но ведь для отбора других полей всё равно будет сканирование таблицы… Или я что-то неправильно делаю или неправильно понимаю?

Если только подзапросом отобрать ID по значению веса и другим запросом уже с помощью ПК по этим ID отобрать всё, что нужно… И то не уверен.
0
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
26.08.2024, 16:13
Цитата Сообщение от Jack Famous Посмотреть сообщение
Индекс по весу может быстро отобрать строки с "вес" = 20. Но ведь для отбора других полей всё равно будет сканирование таблицы…
Для "вес"=20, будет использован индекс по полю вес, предположим такой индекс есть и значение 20 достаточно редкое в этом индексе (ну будет-не будет - это вопрос отдельный, предположим, что будет).

Предположим, что найдутся 10-100 записей с таким весом, так же будут найдены значения кластерного индекса, поскольку в самом индексе по весу эти значения уже есть.

Затем по известным значениям кластерного индекса сервер сделает KeyLookUp (сходит на страницу где лежат остальные поля соответствующие данному значению кластерного индекса), таким образом, произойдёт считывание 10-100 страниц (ну или сколько там занимает запись и какие данные вынимаются, может считать больше-меньше, для простоты будем считать, что каждая запись лежит на отдельной странице).

Поэтому сканирования таблицы не будет (повторюсь, сейчас рассматриваем почти идеальный случай)
1
139 / 105 / 36
Регистрация: 27.07.2022
Сообщений: 357
26.08.2024, 16:21
Цитата Сообщение от PaulWist Посмотреть сообщение
для простоты будем считать, что каждая запись лежит на отдельной странице)
Емнип, даже если они на одной станице лежат, по KeyLookUp они не за раз вычитаются, а будет ровно столько обращений к одной и той же странице, сколько там нужных записей
1
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
26.08.2024, 16:27  [ТС]
PaulWist, katamoto, кажется, нужно пробовать всё-таки. Но за науку спасибо! Немного успокоили, если можно так сказать
0
139 / 105 / 36
Регистрация: 27.07.2022
Сообщений: 357
26.08.2024, 16:38
Jack Famous, Если есть желание погрузиться чуть глубже - на ютубе на канале Brent Ozar-а есть плейлист How to Think Like the SQL Server Engine, рекомендую
1
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
26.08.2024, 17:21  [ТС]
katamoto, большое спасибо! Обязательно гляну.
0
1304 / 358 / 97
Регистрация: 14.10.2022
Сообщений: 1,087
26.08.2024, 18:42
Цитата Сообщение от katamoto Посмотреть сообщение
Емнип, даже если они на одной станице лежат, по KeyLookUp они не за раз вычитаются, а будет ровно столько обращений к одной и той же странице, сколько там нужных записей
Безусловно. Вот только в память страница будет поднята один раз.
(Ну, разумеется если в системе PLE не на уровне единиц).
1
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
27.08.2024, 08:42  [ТС]
katamoto, большое спасибо! Обязательно гляну.
Цитата Сообщение от uaggster Посмотреть сообщение
если в системе PLE не на уровне единиц
можно тут поподробнее?) Что это?
0
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
27.08.2024, 10:23
Цитата Сообщение от Jack Famous Посмотреть сообщение
Что это?
Первоисточник

Компиляция и Вольный перевод
1
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
27.08.2024, 11:39  [ТС]
PaulWist, спасибо
0
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
27.08.2024, 11:56
Цитата Сообщение от katamoto Посмотреть сообщение
Емнип, даже если они на одной станице лежат, по KeyLookUp они не за раз вычитаются, а будет ровно столько обращений к одной и той же странице, сколько там нужных записей
Ммм, я писал про кол-во считанных страниц (логических операций чтения), а не про количество обращений к странице, впрочем uaggster дал пояснение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.08.2024, 11:56
Помогаю со студенческими работами здесь

Особености Primary Key для SELECT * FROM
Начал использовать ORACLE 8.1.5 Столкнулся с простейшей проблемой сортировки по умолчанию по первичному ключу. - Создаю таблицу, где...

SQLite - оптимальный размер транзакции, стоит ли использовать FOREIGN KEY, связь PRIMARY KEY и INDEX
1. Оптимальный размер транзакции 1.1. Есть ли какое-то ограничение на размер или содержание одной транзакции? 1.2. Может ли размер...

Зачем нужны primary key и foreign key?
Пожалуйста, объясните самым простым языком зачем эти ключи нужны? Какова их функция? Как они работают? В чём приемущество?

И снова ключи: PRIMARY KEY, FOREIGN KEY
Подскажите в чём тут ошибка? Не хочет создавать вторую таблицу. Глаза уже сломал... create table Contact_Date ( city varchar...

Как прописать PRIMARY KEY для Paradox?
...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru