Недавно я преследовал проблему с клиентским db ... решение найдено, но невозможно воссоздать.
По сути, мы делаем
Select * from mytable where ArbitraryColumn = 75
Если MyTable имеет столбец Identity, называемый MyIndentityColumn, увеличивающийся на единицу в каждой вставке. Естественно и обычно я предполагаю, что возвращаемый порядок будет тем порядком, в котором они были вставлены (плохое предположение, но оно было навязано мне через унаследованное приложение, которое было исправлено).
По сути, мне хотелось бы узнать, почему база данных при восстановлении на моем локальном компьютере (та же ОС, та же версия SQL-сервера - 200 sp3) такая же сортировка и тот же экземпляр резервной копии, восстановленный на ней, как тестовая БД на клиентском сайте.
Когда я выполняю вышеуказанный выбор, я получаю их в порядке вставки (т.е. столбец идентификаторов упорядочен по возрастанию). На клиенте это кажется случайным (но каждый раз в том же «случайном» порядке) ...
Еще несколько моментов:
У меня проблема `` решена '' путем добавления явного предложения order by, но я хочу понять причину проблемы, учитывая точный характер моих попыток воссоздать ее бесполезными и прекрасно воспроизводимыми на клиентском сервере ...
Заранее спасибо,
Дэйв
Порядок, в котором возвращаются записи, зависит от вашей индексации. В игру вступают три вещи:
Единственный способ гарантировать порядок возвращаемых записей - использовать оператор ORDER BY. Если вы зависите от конкретного порядка возвращаемого набора записей, вы должны использовать оператор ORDER BY.
Порядок набора рекордов определяется только самым внешним ORDER BY.
Во избежание сомнений: нет порядка сортировки по умолчанию
Упомянутый вами "воспроизводимый" порядок отражает только то, как SQL Server читает данные в плане выполнения для ваш сервер в который время. Тот же пакет обновления? То же издание? Такое же количество процессоров (включая HT)? Точно такие же параметры SET?
Если план изменится, вероятно, изменится и порядок. Это не имело ничего общего с порядком вставки, порядком индексации или порядком расположения на диске.
Этот вопрос относится к StackOverflow, и на него уже был дан ответ:
Из MSDN, Сортировка строк с помощью ORDER BY
ORDER BY гарантирует отсортированный результат только для самого внешнего оператора SELECT запроса. Например, рассмотрим следующее определение представления
Из Блог Конора ,
Учитывает ли оптимизатор запросов SQL Server фрагментацию индекса при выборе плана?
Нет, это не имеет значения.
После тщательного расследования мы обнаружили проблему с маршрутом ...
У клиента был дополнительный индекс для таблицы, который приводил к рассинхронизации всего, но только на их сервере. При локальном тестировании либо резервное копирование LDF / MDF, либо восстановление в новую базу данных - проблемы не было.
На клиентском компьютере, на исходном mdf / mdf после резервного копирования и восстановления или на новой базе данных, на которую было восстановлено, проблема проявляется на 100% надежно.
В качестве доказательства того, что причиной был индекс, мы можем удалить и повторно добавить индекс и увидеть, как происходит нежелательное поведение, а затем не происходит.