Сортировка первичного ключа

Вот решение PHP:

$day = Array('first','second','third','fourth','fifth','sixth','seventh',
             'eighth','ninth','tenth','eleventh','twelfth');
$gifts = Array('Twelve drummers drumming,',
               'Eleven pipers piping,',
               'Ten lords a-leaping,',
               'Nine ladies dancing,',
               'Eight maids a-milking,',
               'Seven swans a-swimming,',
               'Six geese a-laying,',
               'FIVE GOLDEN RINGS,',
               'Four calling birds,',
               'Three French hens,',
               'Two turtle doves, and',
               'A partridge in a pear tree');

for ($i = 0; $i < 12; ++$i) {
    printf("On the $day[$i] of Christmas my true love gave to me\n" . 
         implode("\n", array_slice($gifts,-($i+1))) . "\n\n");
}
7
задан Welbog 10 July 2009 в 15:56
поделиться

7 ответов

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

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

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

EDIT

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

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

)

РЕДАКТИРОВАТЬ

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

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

)

РЕДАКТИРОВАТЬ

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

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

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

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

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

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

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

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

13
ответ дан 6 December 2019 в 11:51
поделиться

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

  • Таблица может иметь только один CLUSTERED (имеет смысл)
  • Используйте синтаксис PRIMARY KEY CLUSTERED для DDL.
  • Order by PK все еще должен быть выполнен в ваших SELECTS, факт кластеризации приведет к тому, что запрос будет выполняться быстрее, так как план оптимизатора будет знать, что это не так необходимо выполнить сортировку по кластеризованному индексу

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

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

1
ответ дан 6 December 2019 в 11:51
поделиться

Without an explicit ORDER BY, there is no default sort order. A very common question. As such, there is a canned answer:

Without ORDER BY, there is no default sort order.

Can you elaborate why "The performance difference is significant."?

2
ответ дан 6 December 2019 в 11:51
поделиться

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

1
ответ дан 6 December 2019 в 11:51
поделиться

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

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

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

Марк

0
ответ дан 6 December 2019 в 11:51
поделиться

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

0
ответ дан 6 December 2019 в 11:51
поделиться

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

0
ответ дан 6 December 2019 в 11:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: