Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как работает функция MAX()  [new]
Yagrus2
Member

Откуда: Москва
Сообщений: 902
Здравствуйте.
Возник вопрос как, работает функция MAX() на строковых типах данных(varchar(N))
20 апр 13, 15:49    [14207813]     Ответить | Цитировать Сообщить модератору
 Re: Как работает функция MAX()  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Yagrus2,

логически, - сортировка в словарном порядке по убыванию, результат - первая строка.
NULL игнорируется.
20 апр 13, 17:36    [14208029]     Ответить | Цитировать Сообщить модератору
 Re: Как работает функция MAX()  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
iap
Yagrus2,

логически, - сортировка в словарном порядке по убыванию, результат - первая строка.
NULL игнорируется.
Не совсем точно, поскольку неоднозначным выглядит словосочетание
"в словарном порядке".

В общем, сравнение двух строк происходит так:

1. берутся первые символы.
1.1. если символ первой строки больше символа второй, то вся первая строка больше второй.
1.2. если символ второй строки больше символа первой, то вся вторая строка больше первой.
2. если первые символы равны, то берутся вторые символы и сравниваются так же, как первые.
3. это продолжается, пока символы одной из строк не закончатся.
если в этот момент закончились символы и в другой строке, то эти строки равны.
если же в другой строке есть ещё символы, то эта другая строка больше.

Больше или меньше один символ, чем другой, определяется COLLATIONом, определённым
для операции сравнения, в том числе и по-умолчанию.
20 апр 13, 21:28    [14208600]     Ответить | Цитировать Сообщить модератору
 Re: Как работает функция MAX()  [new]
Yagrus2
Member

Откуда: Москва
Сообщений: 902
iap,
Спасибо за развернутый ответ
21 апр 13, 13:33    [14209628]     Ответить | Цитировать Сообщить модератору
 Re: Как работает функция MAX()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Если я не путаю, то индексированная работа со сторками работает через хеширование.
В итоге механизм сравнения для всех типов данных одинаков - бинарная сортировка.
Получается что для каждого колейшина своя функция хеширования.

Исправьте, если я ошибаюсь, и хожу с розовыми очками.
21 апр 13, 17:23    [14210046]     Ответить | Цитировать Сообщить модератору
 Re: Как работает функция MAX()  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Mnior
Если я не путаю, то индексированная работа со сторками работает через хеширование.
В итоге механизм сравнения для всех типов данных одинаков - бинарная сортировка.
Получается что для каждого колейшина своя функция хеширования.

Исправьте, если я ошибаюсь, и хожу с розовыми очками.
Это как раз о физческой реализации.
А я же сразу сказал: "логически".

Про реализацию мне сказать, увы, нечего. :((
21 апр 13, 19:48    [14210378]     Ответить | Цитировать Сообщить модератору
 Re: Как работает функция MAX()  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Если подобное высказывание навеяно вот этой статьёй http://www.interface.ru/home.asp?artId=5477 , то не думаю, что всё так однозначно (хотя не факт, что может использоваться именно checksum):

select 'a' as letter, CHECKSUM('a') as checksum, ASCII('a') as ascii
union all
select 'A' as f, CHECKSUM('A') as c, ASCII('A')
union all
select 'a' as f, CHECKSUM('a') as c, ASCII('a')
union all
select 'B' as f, CHECKSUM('B') as c, ASCII('B')
union all
select 'b' as f, CHECKSUM('b') as c, ASCII('b')
union all
select 'B' as f, CHECKSUM('B') as c, ASCII('B')
order by 1



letter checksum ascii
a 108 97
a 108 97
A 108 65
b 109 98
B 109 66
B 109 66




Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)
Jun 17 2011 00:54:03
Copyright (c) Microsoft Corporation
Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
22 апр 13, 02:23    [14211005]     Ответить | Цитировать Сообщить модератору
 Re: Как работает функция MAX()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iap
Это как раз о физческой реализации.
А я же сразу сказал: "логически".
Ну, ссори за мой оффтоп.

SIMPLicity_, сенкс, но мене вспоминается что это прямо в статьях по индексам было написано.
И в соседней ячейке памяти почему-то про ограничеие в 900 байт.
22 апр 13, 02:47    [14211015]     Ответить | Цитировать Сообщить модератору
 Re: Как работает функция MAX()  [new]
aleks2
Guest
Mnior
Если я не путаю, то индексированная работа со сторками работает через хеширование.
В итоге механизм сравнения для всех типов данных одинаков - бинарная сортировка.
Получается что для каждого колейшина своя функция хеширования.

Исправьте, если я ошибаюсь, и хожу с розовыми очками.


"индексированная работа со строками НЕ может работать через хеширование", ибо порядок строк и порядок хеша этих строк совсем не обязан совпадать.

Более того, он гарантированно не совпадает. Так уж устроен хэш.
22 апр 13, 06:23    [14211064]     Ответить | Цитировать Сообщить модератору
 Re: Как работает функция MAX()  [new]
Гость333
Member

Откуда:
Сообщений: 3683
aleks2
Более того, он гарантированно не совпадает. Так уж устроен хэш.

Т.е. если Строка1 > Строка2, то Хэш(Строка1) < Хэш(Строка2)? Вы гарантируете это?
22 апр 13, 11:14    [14211664]     Ответить | Цитировать Сообщить модератору
 Re: Как работает функция MAX()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Гость333
Т.е. если Строка1 > Строка2, то Хэш(Строка1) < Хэш(Строка2)?
На самом деле нет.
Но на практике, чтобы удовлетворять условию "быстро вычисляться", часто так и есть.

Возможно путает всех терминология.
Можно ли назвать функцию перестановки символов в таблице кодов хешевой, ведь длина хеша совпадает с диной строки?
Видимо нет. Тогда назовём не хеш строки, а "мап" строки.

При не совпадении колейшина индекса - он не юзается.
SELECT * FROM sys.objects WHERE name = N'test'
SELECT * FROM sys.objects WHERE name = N'test' COLLATE Greek_CS_AS
22 апр 13, 13:53    [14212687]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить