Подтвердить что ты не робот

Выбор сортировки SQL Server

Я потратил много времени на этот вечер, пытаясь найти руководство о том, какой выбор сортировки применять в моей установке SQL Server 2008 R2, но почти все онлайн в основном говорит "выберите то, что подходит вам". Чрезвычайно бесполезный.

Мой контекст - это новая разработка приложений. Я не беспокоюсь о обратной совместимости с предыдущей версией SQL Server (например, <= 2005). Я очень заинтересован в хранении данных, представляющих языки со всего мира, а не только на латинском языке. Что очень мало помогает мне найти в Интернете, мне следует избегать всех "SQL_" коллайсов. Это сужает мой выбор использования бинарного или "не двоичного" сопоставления, основанного на локали Windows.

Если я использую двоичный код, я собираюсь использовать "BIN2". Так что это мой вопрос. Как определить, следует ли использовать BIN2 или просто "Latin1_General_100_XX_XX_XX"? Мое чувство паука говорит мне, что BIN2 обеспечит сопоставление, которое "менее точное", но более общее для всех языков (и быстро!). Я также подозреваю, что двоичная сортировка чувствительна к регистру, чувствительна к акценту и чувствительна к кане (да?). Напротив, я подозреваю, что недвоичная сортировка лучше всего подходит для латинских языков.

Документация не поддерживает мои претензии выше, я делаю обоснованные догадки. Но это проблема! Почему онлайн-документация настолько тонкая, что выбор остается догадки? Даже в книге "Внутренние серверы SQL Server 2008" обсуждалось множество вариантов, не объясняя, почему и когда будет выбрана двоичная сортировка (по сравнению с сопоставлением не двоичных окон). Criminy!!!

4b9b3361

Ответ 1

"Внутренние базы SQL Server 2008" имеет хорошее обсуждение темы imho.

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

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

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

Что действительно важно, так это то, что вы избегаете смешивания сортировок в предложении WHERE, потому что там, где вы платите штраф, не используя индексы. Afaik нет серебряной пули для поддержки всех языков. Вы можете выбрать один для большинства своих пользователей или войти в поддержку локализации с разными столбцами для каждого языка.

Важно, чтобы сортировка сервера была такой же, как и сортировка базы данных. Это упростит вашу жизнь, если вы планируете использовать временные таблицы в качестве временных таблиц, если они созданы с помощью "CREATE TABLE #ttt...", забрать сортировку сервера, и вы столкнетесь с конфликтами сортировки, которые вам нужно будет решить с помощью указав явное сопоставление. Это также влияет на производительность.

Ответ 2

Пожалуйста, не считайте мой ответ полным, но вы должны учитывать следующие моменты:

  • (как указано #Anthony). Все текстовые поля должны использовать тип данных nvarchar. Это позволит вам хранить любой символ с любого языка, как определено набором символов UTF-8\unicode! Если вы этого не сделаете, вы не сможете смешивать текст из разных источников (латинский, кириллический, арабский и т.д.) В своих таблицах.

Это говорит о том, что ваш выбор сортировки будет в основном влиять на следующее:

  • Последовательность сортировки или правила сортировки, которые должны быть установлены между символами, такими как 'e' и 'é', или 'c' и 'ç' (если они считаются равными или нет?). В некоторых случаях последовательности сортировки рассматривают конкретные комбинации букв, как и в венгерском, где C и CS, или D, DZ и DZS считаются независимыми.
  • Проанализированы пути пробелов (или другие символы без буквы): какой из них является правильным "алфавитным" порядком?

этот (пробелы считаются символами первого ранга)?

San Juan
San Teodoro
Santa Barbara

или этот (пробелы в заказе не учитываются)?

San Juan
Santa Barbara
San Teodoro
  • Сопоставление также влияет на чувствительность к регистру: прописные буквы должны рассматриваться как похожие на маленькие буквы?

Ответ 3

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

Ответ 4

Пока вы используете столбцы NVARCHAR (как и для смешанных международных данных), все команды * _BIN и * _BIN2 выполняют одно и то же двоичное сравнение/сортировку на основе кодовых точек Unicode. Неважно, какой из них вы выбираете. Latin1_General_BIN2 выглядит как разумный общий выбор.

Источник: http://msdn.microsoft.com/en-us/library/ms143350(v=sql.105).aspx