Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Поясните про скорость соединений  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Есть 4 таблицы с GUIDами, в каждой по миллионов записей.
Данные в таблицах копипаста.

Я тут погонял тесты типа
SELECT G1.ID FROM GUIDS G1
INNER JOIN  GUIDS_J G2     ON G1.ID = G2.ID 
WHERE  G1.ID IN (SELECT ID FROM #VG_E  /* #VG_E 300к  гуидов, упорядоченных */)


И с изумлением обнаружил, что джойн GUID-GUID с фильтром по GUID в среднем в 2.4 раза быстрее чем VARCHAR -VARCHAR с фильтром по VARCHAR .

При этом, мне казалось, зарубежная пресса ™ пишет, что джойн по VARCHAR не сильно проигрывает GUID.
По мне 2.4 раза это весьма существенно.

Вообще это нормальное поведение, или я что-то не учел в экспериментах?
16 янв 18, 16:42    [21111479]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
*4 таблицы

CREATE TABLE dbo.GUIDS  ( ID uniqueidentifier primary key  ) 
CREATE TABLE dbo.GUIDS_J ( ID uniqueidentifier primary key  ) 
  
CREATE TABLE dbo.VARCHAR_GUIDS  ( ID varchar(36) primary key   )  
CREATE TABLE dbo.VARCHAR_GUIDS_J  ( ID varchar(36) primary key   ) 
16 янв 18, 16:43    [21111481]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
я бы ставил на разницу в длинне, но может есть и более весомые аргументы
16 янв 18, 16:49    [21111503]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
Ну ты что? Varchar - самый медленный join. В GUID 16 байт строго, а строка у тебя в 2 раза больше і к тому же переменной длінны. Даже не зная фізіку процесса, можно обоснованно предположіть, что...
16 янв 18, 16:49    [21111505]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
ДЫк я понимаю что в два раза больше. Просто на всяких "технетах" и "скульблогах" (уже не найду) писали, что разница незначительна.

Хотя если они там на два порядка меньше джойнили, то и правда незначительна...
16 янв 18, 16:53    [21111517]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Cammomile,

автор
в среднем в 2.4 раза быстрее

SELECT (36+2)/16.

2.375000 :)
16 янв 18, 16:57    [21111533]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Шыфл,
автор
к тому же переменной длінны.


Как показал тест, CHAR(36) выигрывает по скорости какие-то крохи, так, что "варчарность" роляет слабо.
16 янв 18, 17:00    [21111548]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
TaPaK
Cammomile,

автор
в среднем в 2.4 раза быстрее

SELECT (36[b]+2[/b])/16.

2.375000 :)

Стесняюсь спросить но спршу, +2 это что?
16 янв 18, 17:04    [21111560]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А, из доков. Вопрос снят.
16 янв 18, 17:07    [21111569]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Cammomile,

The storage size is the actual length of the data entered + 2 bytes.
16 янв 18, 17:07    [21111570]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
04cf9f9576a6f15
Member [заблокирован]

Откуда:
Сообщений: 2927
Cammomile
Шыфл,
автор
к тому же переменной длінны.


Как показал тест, CHAR(36) выигрывает по скорости какие-то крохи, так, что "варчарность" роляет слабо.
Вы решили, что GUID внутри хранится в символах? Насколько я помню, это 128 бит. То есть, 16 байт. А вот CHAR(36) это таки 36 байт.

#Хэш=
16 янв 18, 17:30    [21111624]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Я не решил.
Это коллега Шифл сделал предположение, что вариативность варчара сказывается на скорости. На самом деле нет.
16 янв 18, 17:38    [21111651]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
invm
Member

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

+
use tempdb;
go

create table dbo.t1 (id uniqueidentifier primary key);
create table dbo.t2 (id uniqueidentifier primary key);
create table dbo.t3 (id varchar(36) primary key);
create table dbo.t4 (id varchar(36) primary key);
create table dbo.t5 (id varchar(36) collate Cyrillic_General_BIN primary key);
create table dbo.t6 (id varchar(36) collate Cyrillic_General_BIN primary key);
go

insert into dbo.t1
 (id)
 output inserted.id into dbo.t2
 select top (1000000)
  newid()
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;

insert into dbo.t3
 (id)
 select cast(id as varchar(36)) from dbo.t1;

insert into dbo.t4
 (id)
 select cast(id as varchar(36)) from dbo.t1;

insert into dbo.t5
 (id)
 select cast(id as varchar(36)) from dbo.t1;

insert into dbo.t6
 (id)
 select cast(id as varchar(36)) from dbo.t1;
go

declare @c int;
set statistics time on;
select @c = count(*) from dbo.t1 join dbo.t2 on t2.id = t1.id option (maxdop 1);
select @c = count(*) from dbo.t3 join dbo.t4 on t4.id = t3.id option (maxdop 1);
select @c = count(*) from dbo.t5 join dbo.t6 on t5.id = t6.id option (maxdop 1);
set statistics time off;
go

drop table dbo.t1, dbo.t2, dbo.t3, dbo.t4, dbo.t5, dbo.t6;
go
 Время работы SQL Server:
Время ЦП = 218 мс, затраченное время = 214 мс.

Время работы SQL Server:
Время ЦП = 1139 мс, затраченное время = 1139 мс.

Время работы SQL Server:
Время ЦП = 281 мс, затраченное время = 284 мс.
16 янв 18, 18:07    [21111733]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
04cf9f9576a6f15
Member [заблокирован]

Откуда:
Сообщений: 2927
Cammomile
Я не решил.
Это коллега Шифл сделал предположение, что вариативность варчара сказывается на скорости. На самом деле нет.
Сказывается, да. Зависит от нюансов. Например, у варчара из-за вариативности свои особенности хранения на страницах, которые могут приводить к дополнительным издержкам. Зато за счёт компактности данные могут занимать меньше места и требовать меньше операций ввода-вывода.

А в данном конкретном примере скорее всего тупо из-за размеров данных процессору пришлось читать больше страниц. Как физически, так и логически. Отсюда и разница в скорости.

Отсюда простой вывод: если размер ВСЕХ записей одинаков исходя из постановки задачи (например, номер паспорта, почтовый индекс), то вариативность будет лишней. Если данные на самом деле имеют существенный разброс в размерах (например, фамилия), то вариативность будет в плюс.

#Хэш=
16 янв 18, 18:14    [21111752]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
04cf9f9576a6f15
А в данном конкретном примере скорее всего тупо из-за размеров данных процессору пришлось читать больше страниц. Как физически, так и логически. Отсюда и разница в скорости.
invm же всё разжевал.

Сравнение varchar - это сложный алгоритм, в котором веса символа зависят даже от расположения соседних символов.
Делаете BIN - коллейшен, и скорость получается примерно как у GUID
16 янв 18, 19:49    [21111968]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
04cf9f9576a6f15
Member [заблокирован]

Откуда:
Сообщений: 2927
alexeyvg
04cf9f9576a6f15
А в данном конкретном примере скорее всего тупо из-за размеров данных процессору пришлось читать больше страниц. Как физически, так и логически. Отсюда и разница в скорости.
invm же всё разжевал.

Сравнение varchar - это сложный алгоритм, в котором веса символа зависят даже от расположения соседних символов.
Делаете BIN - коллейшен, и скорость получается примерно как у GUID
Коллейшн - это другой фактор. А тут я говорил о разнице между CHAR и VARCHAR. И то и другое - символы. Просто для хранения первого выделяется фиксированное количество байт независимо от реальной длины строки. А для хранения второго столько, сколько строка занимает на самом деле (плюс пара-тройка служебных байт).

#Хэш=
16 янв 18, 20:42    [21112075]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
04cf9f9576a6f15
alexeyvg
invm же всё разжевал.

Сравнение varchar - это сложный алгоритм, в котором веса символа зависят даже от расположения соседних символов.
Делаете BIN - коллейшен, и скорость получается примерно как у GUID
Коллейшн - это другой фактор. А тут я говорил о разнице между CHAR и VARCHAR. И то и другое - символы. Просто для хранения первого выделяется фиксированное количество байт независимо от реальной длины строки. А для хранения второго столько, сколько строка занимает на самом деле (плюс пара-тройка служебных байт).

#Хэш=
Вашу мысль про вариативность и зависимость от этого скорости я понял, это я ответил на фразу: "А в данном конкретном примере скорее всего тупо из-за размеров данных процессору пришлось читать больше страниц. Как физически, так и логически. Отсюда и разница в скорости."
Которую, кстати, процитировал в ответе, как обычно я делаю.
Надо читать, на что вы отвечаете :-)


04cf9f9576a6f15
Например, у варчара из-за вариативности свои особенности хранения на страницах, которые могут приводить к дополнительным издержкам. Зато за счёт компактности данные могут занимать меньше места и требовать меньше операций ввода-вывода.
Ой, а что мы гадаем? давайцте модифицируем скрипт выше, добавив char, что бы сравнить с varchar
И ещё размеры строк сделаем как в GUID, что бы не было разницы в размере полей
+
use tempdb;
go

create table dbo.t1 (id uniqueidentifier primary key);
create table dbo.t2 (id uniqueidentifier primary key);
create table dbo.t3 (id varchar(16) primary key);
create table dbo.t4 (id varchar(16) primary key);
create table dbo.t5 (id varchar(16) collate Cyrillic_General_BIN primary key);
create table dbo.t6 (id varchar(16) collate Cyrillic_General_BIN primary key);
create table dbo.t7 (id char(16) primary key);
create table dbo.t8 (id char(16) primary key);
go

insert into dbo.t1
 (id)
 output inserted.id into dbo.t2
 select top (1000000)
  newid()
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;

insert into dbo.t3
 (id)
 select left(cast(id as varchar(36)), 16) from dbo.t1;

insert into dbo.t4
 (id)
 select left(cast(id as varchar(36)), 16) from dbo.t1;

insert into dbo.t5
 (id)
 select left(cast(id as varchar(36)), 16) from dbo.t1;

insert into dbo.t6
 (id)
 select left(cast(id as varchar(36)), 16) from dbo.t1;
go

insert into dbo.t7
 (id)
 select left(cast(id as varchar(36)), 16) from dbo.t1;
go

insert into dbo.t8
 (id)
 select left(cast(id as varchar(36)), 16) from dbo.t1;
go

declare @c int;
set statistics time on;
select @c = count(*) from dbo.t1 join dbo.t2 on t2.id = t1.id option (maxdop 1);
select @c = count(*) from dbo.t3 join dbo.t4 on t4.id = t3.id option (maxdop 1);
select @c = count(*) from dbo.t7 join dbo.t8 on t7.id = t8.id option (maxdop 1);
select @c = count(*) from dbo.t5 join dbo.t6 on t5.id = t6.id option (maxdop 1);
set statistics time off;
go

drop table dbo.t1, dbo.t2, dbo.t3, dbo.t4, dbo.t5, dbo.t6, dbo.t7, dbo.t8;
go
Я получил:
GUID 219 ms
varchar 1968 ms
char 2563 ms
varchar bin 937 ms

Можно ещё добавить CHAR BIN...
PS char стабильно медленнее varchar, запускал несколько раз
17 янв 18, 00:04    [21112447]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
У меня без указания бинарного коллейшена чар был стабильно быстрее варчара, но на крохи. Типа варчар 3600 чар 3450.
17 янв 18, 11:23    [21113162]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
04cf9f9576a6f15
Member [заблокирован]

Откуда:
Сообщений: 2927
alexeyvg
PS char стабильно медленнее varchar, запускал несколько раз
Занятно.
17 янв 18, 11:37    [21113245]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
04cf9f9576a6f15
alexeyvg
PS char стабильно медленнее varchar, запускал несколько раз
Занятно.

мож у Алексея что не то с серваком? )) у меня - примерно одинаковые 1 и 4 и примерно одинаковые 2 и 3 , т.е. бинари примерно равно guid и guid быстрее binary на проценты. char примерно равен varchar. char на доли процента быстрее varchar.
17 янв 18, 11:53    [21113299]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Померял с колейшеном. Варчары с колейшеном джойнятся на четверть медленней чем нормальные GUIDы. Это, конечно, лучше чем в 2.4 раза, НО все же не сказать чтобы "незначительно".
17 янв 18, 12:14    [21113369]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
Cammomile
Померял с колейшеном. Варчары с колейшеном джойнятся на четверть медленней чем нормальные GUIDы. Это, конечно, лучше чем в 2.4 раза, НО все же не сказать чтобы "незначительно".

таки смотреть характеристики серверов? ибо у меня разница максимум 10% в среднем 2-4% , правда я делаю не в tempdb.
17 янв 18, 12:22    [21113395]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А вот какой смысл колейшн для гуида указывать кирилицу а не латынь?
17 янв 18, 14:02    [21113882]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Cammomile
А вот какой смысл колейшн для гуида указывать кирилицу а не латынь?

там нет тайного смысла, он написал первый попавшийся binary
17 янв 18, 14:08    [21113911]     Ответить | Цитировать Сообщить модератору
 Re: Поясните про скорость соединений  [new]
04cf9f9576a6f15
Member [заблокирован]

Откуда:
Сообщений: 2927
Cammomile
А вот какой смысл колейшн для гуида указывать кирилицу а не латынь?
Его вообще нет смысла хранить в виде символьной строки.
DECLARE @b UNIQUEIDENTIFIER = NEWID();
DECLARE @c CHAR(36) = @b;

SELECT DATALENGTH(@b), DATALENGTH(@c)

1636

#Хэш=
17 янв 18, 15:49    [21114260]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить