Как тип данных PK таблицы SQL влияет на производительность запросов? - PullRequest
2 голосов
/ 28 июня 2011

Как тип данных PK таблицы SQL влияет на производительность запросов?

В частности, я заинтересован в:

  1. В чем разница между строковыми типами данных (например, nvarchar(n), varchar(n)) и числовыми типами данных (int, bigint, uniqueidentifier)?

  2. В чем разница между различными типами строковых данных?

  3. Как максимальная длина строкового типа данных влияет на производительность? Существует ли конкретная длина varchar или nvarchar, при которой производительность резко падает?

  4. В чем разница между различными числовыми типами данных?

  5. Как эти вариации влияют:

    1. Сравнение равенства первичных ключей?

    2. Присоединяется к первичным ключам?

    3. Обновления по первичному ключу?

    4. Сравнение комплексных значений по первичному ключу (например, с LIKE для varchar или <= для int)?

  6. Если существует существенное несоответствие между различными вариантами, то, какие меры могут быть приняты для оптимизации производительности с более медленными типами данных?

  7. Как композитный ПК сравнивается с другими параметрами?

Обновление: Чтобы было ясно, я понимаю, что это длинный вопрос, и я не прошу, чтобы меня кормили всей этой информацией. Ответа, который предоставляет ссылки на надежные онлайн-ресурсы, где я могу найти эту информацию, вполне достаточно.

Обновление 2:

Я использую SQL Server Express 2008.

Ответы [ 3 ]

4 голосов
/ 28 июня 2011

У меня нет точных цифр - но из опыта и всего, чему я научился за эти годы, я бы сказал:

  • попробуйте использовать клавишу фиксированной длины - INT, BIGINT, CHAR(x) (для x <= 6 символов) - с ними, как правило, легче иметь дело, и дать SQL Server меньше затрат на работу. Избегайте больших <code>VARCHAR значений

  • , поскольку SQL Server имеет ограничение в 900 байтов для каждой записи индекса - даже не пытайтесь использовать VARCHAR(MAX) или что-то возмутительное в этом роде .....

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

    • узкий (4-8 байтов идеально)
    • статический (никогда или почти никогда не меняется)
    • уникально (иначе SQL Server должен будет добавить 4-байтовый уникализатор .....)
    • постоянно увеличивается (т. Е. INT IDENTITY идеально) для уменьшения индекса и фрагментации страницы из-за разбиения страниц в ваших структурах индекса

На сегодняшний день лучшим, самым авторитетным и наиболее исчерпывающим ресурсом по индексированию SQL Server (а также тем, что нужно делать и чего следует избегать) будет блог Кимберли Трипп, особенно ее категория «Индексы» . Отличный материал!

1 голос
/ 28 июня 2011

Я предполагаю, что под «первичным ключом» вы ссылаетесь на кластеризованный индекс в таблице, поскольку по умолчанию они одинаковы в SQL Server.

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

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

В чем разница между различными типами строковых данных?

nvarchar может содержать строки различной ширины.nchar содержит строки постоянной предварительно определенной ширины.(Существуют также типы данных varchar и char, которые включены для обратной совместимости, но их следует избегать, поскольку они требуют преобразования данных в устаревшие кодировки символов и обратно при каждой записи или чтении.)

Я настоятельно рекомендую прочитать документацию по SQL Server о типах данных для ответов на другие ваши вопросы.

1 голос
/ 28 июня 2011

Чем «более узкий» тип данных, то есть чем меньше количество байтов, которые принимает тип данных, тем выше будет производительность.

Например, INT обычно занимает 4 байта.VARCHAR (4) делает то же самое для большинства баз данных, но VARCHAR (5+) использует больше байтов, чем INT .. и наоборот для VARCHAR (меньше 4).Для повторения: INT и VARCHAR (4) [приблизительно] эквивалентны, но VARCHAR (меньше 4) будет меньше (следовательно, «быстрее»), а VARCHAR (5+) будет больше (следовательно, «медленнее»), чем при использованииINT.

Честно говоря, я не буду рассматривать различия между типами данных, потому что

  1. База данных не определена - они не все одинаковые
  2. Данные доступны онлайн
...