1

Скажем, у меня есть база данных, похожая на это;Оптимизация баз данных SQL путем добавления столбцов индекса

Product with columns [ProductName] [Price] [Misc] [Etc] 
Order with columns [OrderID] [ProductName] [Quantity] [Misc] [Etc] 

ProductName является первичным ключом продукта, некоторого типа струн и уникальным.
OrderID - это первичный ключ и некоторый целочисленный тип, а ProductName - внешний ключ.

Скажем, я сменил первичный ключ продукта на новый столбец целочисленного типа, то есть [ProductID].

Будет ли это уменьшать размер базы данных и оптимизировать поиск, соединяющий эти две таблицы (и аналогичные операции), или эти оптимизации выполняются автоматически (большинство/общие/основные) Реализации SQL-баз данных?

Технически, используя (String) ProductName в качестве первичного ключа в Product, база данных должна быть в состоянии реализовать столбец ProductName в Order просто как указатель на строку в Product, а также выполнять JOIN, как QuiCly как имеющий целое число, как внешний ключ, является стандартным способом реализации SQL.

Update: Этого вопрос о том, как SQL сервер обрабатывает внешние ключи, не нуждается ли таблица продукта серийного номера, или как я справиться с изменением названия продукта в базе данных.

ответ

2

Первичный ключ строки - это плохая идея, поэтому ее изменение в INT поможет выполнить производительность. в большинстве баз данных используется индекс первичного ключа для поиска и сравнений, при необходимости выбирайте краткий первичный ключ-один столбец. Вы используете столбцы первичного ключа для объединения (объединение данных из двух или более таблиц на основе общих значений в столбцах объединения), для поиска запросов, а также для группировки или сортировки набора результатов запроса. Чем ярче записи индекса, тем быстрее база данных может выполнять поиск и сравнения.

Не говоря уже о том, изменилось ли название продукта, как вы можете справиться с этим? обновить все строки, содержащие имя продукта в качестве внешнего ключа?

я не мог бы сказать, что лучше, так что проверить этот ответ: Should I design a table with a primary key of varchar or int, цитата из этого ответа:

Используя VARCHAR (10) или (20) просто использует слишком много места - 10 или 20 байтов вместо 4, и то, что много людей не знает - значение ключа кластеризации будет повторяться на каждом отдельном индексе на каждом отдельном некластеризованном индексе на таблице, поэтому потенциально , вы тратите много места (не просто на диске - это дешево - b ut также в основной памяти SQL Server).Кроме того, , так как это переменное (может быть 4, может быть 20 символов) это труднее SQL сервера , чтобы должным образом поддерживать хороший показатель структуры

+0

+1 для указания проблем с изменением названия продукта – Donnie

0

целочисленного столбец действует лучше, чем строка в соединениях

целого autoinc столбцы как первичный кластеризованный ключ хорош для вставок

0

Я не буду уменьшать размер базы данных (предположительно, вы сохраните поле имени продукта), но определенно улучшите производительность поиска.

0

Целочисленный тип данных в большинстве реализаций будет меньше по размеру, чем строка (CHAR, VARCHAR и т. Д.), Это сделает ваш индекс меньшим по размеру.

Кроме того, есть некоторые проблемы с сравнением строк:

  1. Некоторые базы данных, а именно MySQL, сжимают строковые ключи, которые могут сделать поиски менее эффективными.

  2. String B-Trees, которые используют идентификаторы естественного языка, как правило, менее сбалансированы по параллелизму, чем целочисленные B-Trees. Поскольку слова естественного языка равномерно распределены по алфавиту, все больше обновлений и вставок перейдет в один и тот же блок, увеличив количество разбиений на страницы и, в конечном счете, увеличив размер индекса. Чтобы обойти это, Oracle поддерживает предложение REVERSE в индексах.

  3. При сравнении двух строк следует учитывать сопоставление. Обычно это не имеет большого значения, однако, это добавляет некоторые накладные расходы.

+0

B, B + и B- * Деревья всегда сбалансированы. REVERSE не влияет на то, как B-дерево хранит данные, оно просто меняет порядок строки в индексе, чтобы вы могли делать LIKE-запросы в начале строк. В SQL Server вы сделаете это, добавив индексированный вычисленный столбец в обратную строку. И столбцы CHAR не больше целых чисел, если вы используете менее 4 символов. –

+0

@Dave: «Сбалансированный» здесь означает не «сбалансированный по высоте», а «сбалансированный параллелизм», т.е. е. Недостаток страниц снижается. Oracle не будет использовать индексы «REVERSE» для предикатов «LIKE» с ведущим «%», он может использовать такой индекс только для equijoin. – Quassnoi

0

Первичные ключи должны быть уникальными, существуют во время создания строки и быть максимально неизменными. ИМО, дискуссии о том, следует ли использовать суррогатный ключ, должны быть вторичными по отношению к вопросам целостности данных.

Если, например, у продукта был серийный номер, нанесенный на элемент, который должен был существовать во время ввода строки в базе данных и был , то был гарантирован, чтобы быть уникальным, а затем ИМО, который сделал бы хороший первичный ключ , Причина в том, что это значение будет использоваться в качестве внешнего ключа в других таблицах, и это избавит вас от расходов на дополнительный поиск, чтобы получить серийный номер продукта. Дополнительное пространство для хранения является несущественным, пока вы не войдете во многие миллионы строк. Однако, если серийный номер был отпечатан каким-то другим производителем, поэтому у вас не было гарантий уникальности («это, вероятно, уникально» недостаточно,), то суррогат подходит. Фактически, я бы зашел так далеко, чтобы сказать хорошую порцию, если не в большинстве таблиц «продуктов» используются суррогатные ключи, потому что никакая ценность, которая гарантируется быть доступной во время входа, гарантированная быть уникальной и будет относительно неизменной, доступна как ключ.

Однако, многие разработчики, которые используют суррогатные ключи упускать из вида необходимости что каждые таблицы, которая имеет суррогатный ключ должен также иметь другой ключ (то есть ограничение уникальности). Таким образом, в вашем случае с продуктами, даже если вы добавляете целочисленный первичный ключ, вы все равно должны иметь уникальное ограничение на имя продукта. Уникальное ограничение на имя продукта создает то, что называется ключ-кандидат, причем целочисленное значение является первичным ключом.

Суррогатные ключи предназначены для закулисных слизов. В то время как целые ключи работают лучше всего и их легко создать, у них есть один недостаток: просто, заманчиво даже для разработчиков приложений показать ключевое значение для пользователей. Это ошибка ИМО. Пользователи никогда не должны видеть ключевое значение, или они будут полагаться на само значение, которое создает проблемы, если вам нужно переупорядочить значения (например, сказать с объединением базы данных) или использовать значения, созданные в промежутках, созданных Значение идентификатора и они полагаются на последовательные значения. Пока вы никогда не показываете ценность для пользователей, использование целочисленного PK в порядке.

Смежные вопросы