Сортировка первичного ключа - PullRequest
7 голосов
/ 10 июля 2009

Таблица отсортирована по первичному ключу? Если у меня есть таблица с первичным ключом в столбце идентификации BigInt, могу ли я полагать, что запросы всегда будут возвращать данные, отсортированные по ключу, или мне явно нужно добавить «ORDER BY». Разница в производительности значительна.

Ответы [ 7 ]

12 голосов
/ 10 июля 2009

Данные физически хранятся в кластерном индексе, который обычно является первичным ключом, но не обязательно.

Не гарантируется, что данные в SQL будут иметь порядок без предложения ORDER BY. Вы всегда должны указывать предложение ORDER BY, когда вам нужно, чтобы данные были в определенном порядке. Если таблица уже отсортирована таким образом, оптимизатор не будет выполнять какую-либо дополнительную работу, поэтому ее не будет вредно.

Без предложения ORDER BY СУБД может возвращать кэшированные страницы, соответствующие вашему запросу, в то время как она ожидает чтения записей с диска. В этом случае, даже если в таблице есть индекс, данные могут не входить в порядок индекса. (Обратите внимание, что это только пример - я не знаю или даже не думаю, что реальные СУБД сделают это, но это приемлемое поведение для реализации SQL.)

EDIT

Если вы оказываете влияние на производительность при сортировке по сравнению с отсутствием сортировки, вы, вероятно, сортируете по столбцу (или набору столбцов), который не имеет индекса (кластеризованного или иного). Учитывая, что это временные ряды, вы можете сортировать по времени, но кластерный индекс находится на первичном bigint. SQL Server не знает, что оба значения увеличиваются одинаково, поэтому ему приходится прибегать ко всему.

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

2 голосов
/ 10 июля 2009

Без явного ORDER BY порядок сортировки по умолчанию отсутствует. Очень распространенный вопрос. Таким образом, существует законный ответ:

Без ORDER BY порядок сортировки по умолчанию отсутствует.

Можете ли вы объяснить, почему «Разница в производительности значительна»?

1 голос
/ 10 июля 2009

Вы должны применить ORDER BY, чтобы гарантировать заказ. Если вы заметили разницу в производительности, скорее всего, ваши данные не были отсортированы без установленного ORDER BY & mdash; в противном случае SQL-сервер должен вести себя плохо, так как он не понимает, что данные уже отсортированы. Добавление ORDER BY к уже отсортированным данным не должно приводить к снижению производительности, поскольку СУБД должна быть достаточно умной, чтобы реализовать порядок данных.

1 голос
/ 10 июля 2009

Таблица по умолчанию не «кластеризована», то есть организована PK. У вас есть возможность указать его как таковой. Таким образом, по умолчанию используется «HEAP» (в произвольном порядке), а параметр, который вы ищете, - «CLUSTERED» (SQL Server, в Oracle его называют IOT).

  • В таблице может быть только один кластер (имеет смысл)
  • Использовать синтаксис PRIMARY KEY CLUSTERED для DDL
  • Заказ по PK все еще должен быть выдан в ваших SELECTS, факт его кластеризации приведет к ускорению выполнения запроса, поскольку план оптимизатора будет знать, что ему не нужно выполнять сортировку по кластерному индексу

Предыдущий плакат верен, SQL (и его теоретическая основа) специально определяет выбор как неупорядоченный набор / кортеж.

SQL обычно пытается оставаться в логической сфере и не делать предположений о физической организации / расположении и т. Д. Данных. Опция CLUSTERED позволяет нам делать это в реальных жизненных ситуациях.

0 голосов
/ 10 июля 2009

Практически каждый раз он будет сортировать по таблицам идентичности. Он сортируется по кластерному индексу, и не всегда может быть отсортирован по идентификатору, но я никогда не видел, чтобы он не сортировался по идентификатору при выборе *. В чем причина не указывать заказ? Я не понимаю, почему это вызывает разницу в производительности.

0 голосов
/ 10 июля 2009

Это может зависеть от реализации, но MySQL, кажется, сортирует по первичному ключу по умолчанию. Однако всякий раз, когда вам требуется гарантия того, что строки будут упорядочены определенным образом, вы должны добавить ORDER BY.

0 голосов
/ 10 июля 2009

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

Основной функцией первичного ключа является уникальная идентификация каждой строки в таблице, но это не подразумевает никакой (физической) сортировки как таковой.

Не уверен насчет других систем баз данных.

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...