Независимая от регистра сортировка SQL Server

Каковы преимущества и недостатки использования сортировки без учета регистра в SQL Server (с точки зрения производительности запросов)?

У меня есть база данных, которая в настоящее время использует сопоставление без учета регистра, и мне это не очень нравится. Я бы очень хотел изменить его на чувствительный к регистру. Что следует учитывать при изменении сопоставления?


person Klaus Byskov Pedersen    schedule 17.11.2010    source источник


Ответы (5)


(Я добавил это как отдельный ответ, потому что он существенно отличается от моего первого.) Хорошо, нашел кое-какую актуальную документацию. В этой статье MS KB говорится о существующих различиях в производительности между различными сопоставлениями, но не там, где вы думаете. Разница между сопоставлениями SQL (обратно совместимыми, но без поддержки Юникода) и сопоставлениями Windows (с поддержкой Юникода):

Как правило, степень разницы в производительности между сопоставлениями Windows и SQL не будет существенной. Разница проявляется только в том случае, если рабочая нагрузка привязана к ЦП, а не ограничена вводом-выводом или скоростью сети, и большая часть этой нагрузки на ЦП вызвана накладными расходами на манипуляции со строками или сравнения, выполняемые в SQL Server.

И SQL, и Windows имеют версии с учетом регистра и без учета регистра, поэтому похоже, что это не главная проблема.

Еще одна хорошая история "из окопов" в отличной статье Дэна под названием "Ад сортировки":

Я унаследовал смешанную среду сортировки с большим количеством сортировок, чем я могу сосчитать по пальцам одной руки. Различные сопоставления требуют обходных путей, чтобы избежать ошибок «невозможно разрешить конфликт сопоставления», и эти обходные пути снижают производительность из-за выражений, не подлежащих анализу. Работа со смешанной сортировкой — это настоящая боль, поэтому я настоятельно рекомендую вам стандартизировать единственную сортировку и отклоняться от нее только после тщательного обдумывания.

Он заключает:

Я лично не думаю, что производительность следует даже учитывать при выборе правильного сопоставления. Одна из причин, по которой я живу в аду сортировки, заключается в том, что мои предшественники выбрали бинарную сортировку, чтобы максимально использовать производительность наших систем OLTP с высокой степенью транзакций. За единственным исключением ведущего поиска по таблице с подстановочными знаками, я не обнаружил заметной разницы в производительности с нашими различными сопоставлениями. Настоящим ключом к производительности является настройка запросов и индексов, а не сопоставление. Если для вас важна производительность, я рекомендую вам выполнить тест производительности с реальными запросами приложения, прежде чем выбирать параметры сортировки на основе ожидаемой производительности.

Надеюсь это поможет.

person BradC    schedule 17.11.2010
comment
Спасибо, чувак, за сбор этой информации. Я думаю, стало очевидным, что изменение сортировки не будет стоить моего времени. - person Klaus Byskov Pedersen; 17.11.2010

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

create database CollTest COLLATE Latin1_General_CI_AI
go
use CollTest
go
create table T1 (
    ID int not null,
    Val1 varchar(50) not null
)
go
select name,collation_name from sys.columns where name='Val1'
go
alter database CollTest COLLATE Latin1_General_CS_AS
go
select name,collation_name from sys.columns where name='Val1'
go

Результат:

name collation_name
---- --------------
Val1 Latin1_General_CI_AI

name collation_name
---- --------------
Val1 Latin1_General_CI_AI
person Damien_The_Unbeliever    schedule 17.11.2010
comment
+1. Это хорошая информация. Не знал, что при изменении сортировки БД отдельные столбцы также нуждаются в модификации. - person Sachin Shanbhag; 17.11.2010

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

Я не пытался изменить параметры сортировки в существующей базе данных, но подозреваю, что это может занять довольно много времени. Вам, вероятно, придется полностью заблокировать своих пользователей, пока происходит процесс. Не пытайтесь это сделать, если вы не провели тщательное тестирование на dev.

person HLGEM    schedule 17.11.2010
comment
Нет, конечно, он должен пройти тщательное тестирование в средах dev/qa. Но, как вы думаете, достаточно ли велик прирост производительности, чтобы стоить затраченных усилий? - person Klaus Byskov Pedersen; 17.11.2010
comment
Это будет зависеть от сложности существующей базы данных и того фактического прироста производительности, который вы можете получить. Попробуйте создать отдельную копию базы данных с нужными параметрами сортировки и протестируйте запросы, которые, по вашему мнению, повысят производительность. - person HLGEM; 17.11.2010
comment
Я страстно презираю базы данных, чувствительные к регистру. Делает мою работу (как администратора баз данных) намного сложнее. Что вы имеете в виду, столбец не найден, это правильно !@%@# там!! - person BradC; 17.11.2010
comment
Каждая база данных должна быть чувствительна к регистру, не должно существовать возможности сделать запросы нечувствительными к регистру. Если столбец называется Column, это не столбец и не COLUMN. - person Pavel Urbančík; 17.11.2010
comment
@BradC Нечувствительность к регистру сортировки влияет на значения столбца. Select GivenName from Table where GivenName = 'Peter' вернет PETER, peter и peTer. Это отстой. И при таком сравнении должны возникать потери производительности. - person Klaus Byskov Pedersen; 17.11.2010
comment
@Клаус: я не собираюсь оспаривать ваши бизнес-требования (хотя мне никогда не хотелось различать верхнее и нижнее). Что касается производительности, то гораздо проще случайно спроектировать плохо работающие запросы в базе данных с учетом регистра. WHERE UPPER(GivenName) = 'PETER' выполнит полное сканирование таблицы. См. sqlservercode.blogspot.com/2007/05. / - person BradC; 17.11.2010

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

  1. Если ваши бизнес-требования не требуют этого, вы берете на себя много дополнительной работы (это суть ответов как HLGEM, так и Damien_The_Unbeliever).
  2. Если ваши бизнес-требования не требуют этого, вы настраиваете себя на множество возможных ошибок.
  3. Слишком просто создавать плохо работающие запросы в базе данных без учета регистра, если требуется поиск чувствительно к регистру:

Такой запрос:

... WHERE UPPER(GivenName) = 'PETER'

не будет использовать индекс для GivenName. Вы бы подумали что-то вроде:

... WHERE GivenName = 'PETER' COLLATE SQL_Latin1_General_CP1_CS_AS

будет работать лучше, и это работает. Но для максимальной производительности вам нужно сделать что-то вроде:

... WHERE GivenName = 'PETER' COLLATE SQL_Latin1_General_CP1_CS_AS
    AND GivenName LIKE 'PETER'

(подробности см. в этой статье )

person BradC    schedule 17.11.2010
comment
@BradC: Кажется, вы неправильно прочитали статью. Он охватывает более эффективный способ выполнения поиска с учетом регистра в столбце без учета регистра, а не наоборот, как вы, кажется, поняли. Однако вы серьезно обеспокоены возможностью попытки поиска без учета регистра в столбце с учетом регистра. Я не верю, что есть способ сделать это эффективно (то есть без сканирования). И эта проблема значительно подкрепляет вашу точку зрения о том, что без особой потребности в бизнесе столбцы без учета регистра лучше. - person Disillusioned; 02.08.2011

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

person MartW    schedule 17.11.2010