Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поясните про скорость соединений / 25 сообщений из 26, страница 1 из 2
16.01.2018, 16:42
    #39585261
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
Есть 4 таблицы с GUIDами, в каждой по миллионов записей.
Данные в таблицах копипаста.

Я тут погонял тесты типа
Код: sql
1.
2.
3.
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 раза это весьма существенно.

Вообще это нормальное поведение, или я что-то не учел в экспериментах?
...
Рейтинг: 0 / 0
16.01.2018, 16:43
    #39585263
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
*4 таблицы

Код: sql
1.
2.
3.
4.
5.
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   ) 
...
Рейтинг: 0 / 0
16.01.2018, 16:49
    #39585272
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
я бы ставил на разницу в длинне, но может есть и более весомые аргументы
...
Рейтинг: 0 / 0
16.01.2018, 16:49
    #39585274
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
Ну ты что? Varchar - самый медленный join. В GUID 16 байт строго, а строка у тебя в 2 раза больше і к тому же переменной длінны. Даже не зная фізіку процесса, можно обоснованно предположіть, что...
...
Рейтинг: 0 / 0
16.01.2018, 16:53
    #39585282
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
ДЫк я понимаю что в два раза больше. Просто на всяких "технетах" и "скульблогах" (уже не найду) писали, что разница незначительна.

Хотя если они там на два порядка меньше джойнили, то и правда незначительна...
...
Рейтинг: 0 / 0
16.01.2018, 16:57
    #39585290
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
Cammomile,

авторв среднем в 2.4 раза быстрее
Код: sql
1.
SELECT (36+2)/16.


2.375000 :)
...
Рейтинг: 0 / 0
16.01.2018, 17:00
    #39585295
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
Шыфл,
автор к тому же переменной длінны.

Как показал тест, CHAR(36) выигрывает по скорости какие-то крохи, так, что "варчарность" роляет слабо.
...
Рейтинг: 0 / 0
16.01.2018, 17:04
    #39585297
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
TaPaKCammomile,

авторв среднем в 2.4 раза быстрее
Код: sql
1.
SELECT (36+2)/16.


2.375000 :)
Стесняюсь спросить но спршу, +2 это что?
...
Рейтинг: 0 / 0
16.01.2018, 17:07
    #39585303
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
А, из доков. Вопрос снят.
...
Рейтинг: 0 / 0
16.01.2018, 17:07
    #39585304
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
Cammomile,

The storage size is the actual length of the data entered + 2 bytes.
...
Рейтинг: 0 / 0
16.01.2018, 17:30
    #39585323
04cf9f9576a6f15
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
CammomileШыфл,
автор к тому же переменной длінны.

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

#Хэш=
...
Рейтинг: 0 / 0
16.01.2018, 17:38
    #39585335
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
Я не решил.
Это коллега Шифл сделал предположение, что вариативность варчара сказывается на скорости. На самом деле нет.
...
Рейтинг: 0 / 0
16.01.2018, 18:07
    #39585348
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
Cammomile,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 Время работы SQL Server:
   Время ЦП = 218 мс, затраченное время = 214 мс.

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

 Время работы SQL Server:
   Время ЦП = 281 мс, затраченное время = 284 мс.
...
Рейтинг: 0 / 0
16.01.2018, 18:14
    #39585350
04cf9f9576a6f15
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
CammomileЯ не решил.
Это коллега Шифл сделал предположение, что вариативность варчара сказывается на скорости. На самом деле нет.Сказывается, да. Зависит от нюансов. Например, у варчара из-за вариативности свои особенности хранения на страницах, которые могут приводить к дополнительным издержкам. Зато за счёт компактности данные могут занимать меньше места и требовать меньше операций ввода-вывода.

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

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

#Хэш=
...
Рейтинг: 0 / 0
16.01.2018, 19:49
    #39585405
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
04cf9f9576a6f15А в данном конкретном примере скорее всего тупо из-за размеров данных процессору пришлось читать больше страниц. Как физически, так и логически. Отсюда и разница в скорости.invm же всё разжевал.

Сравнение varchar - это сложный алгоритм, в котором веса символа зависят даже от расположения соседних символов.
Делаете BIN - коллейшен, и скорость получается примерно как у GUID
...
Рейтинг: 0 / 0
16.01.2018, 20:42
    #39585421
04cf9f9576a6f15
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
alexeyvg04cf9f9576a6f15А в данном конкретном примере скорее всего тупо из-за размеров данных процессору пришлось читать больше страниц. Как физически, так и логически. Отсюда и разница в скорости.invm же всё разжевал.

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

#Хэш=
...
Рейтинг: 0 / 0
17.01.2018, 00:04
    #39585468
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
04cf9f9576a6f15alexeyvginvm же всё разжевал.

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

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


04cf9f9576a6f15Например, у варчара из-за вариативности свои особенности хранения на страницах, которые могут приводить к дополнительным издержкам. Зато за счёт компактности данные могут занимать меньше места и требовать меньше операций ввода-вывода.Ой, а что мы гадаем? давайцте модифицируем скрипт выше, добавив char, что бы сравнить с varchar
И ещё размеры строк сделаем как в GUID, что бы не было разницы в размере полей
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
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, запускал несколько раз
...
Рейтинг: 0 / 0
17.01.2018, 11:23
    #39585610
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
У меня без указания бинарного коллейшена чар был стабильно быстрее варчара, но на крохи. Типа варчар 3600 чар 3450.
...
Рейтинг: 0 / 0
17.01.2018, 11:37
    #39585632
04cf9f9576a6f15
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
alexeyvgPS char стабильно медленнее varchar, запускал несколько разЗанятно.
...
Рейтинг: 0 / 0
17.01.2018, 11:53
    #39585656
Гигабайт Мегабайтович Килобайтов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
04cf9f9576a6f15alexeyvgPS char стабильно медленнее varchar, запускал несколько разЗанятно.
мож у Алексея что не то с серваком? )) у меня - примерно одинаковые 1 и 4 и примерно одинаковые 2 и 3 , т.е. бинари примерно равно guid и guid быстрее binary на проценты. char примерно равен varchar. char на доли процента быстрее varchar.
...
Рейтинг: 0 / 0
17.01.2018, 12:14
    #39585683
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
Померял с колейшеном. Варчары с колейшеном джойнятся на четверть медленней чем нормальные GUIDы. Это, конечно, лучше чем в 2.4 раза, НО все же не сказать чтобы "незначительно".
...
Рейтинг: 0 / 0
17.01.2018, 12:22
    #39585691
Гигабайт Мегабайтович Килобайтов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
CammomileПомерял с колейшеном. Варчары с колейшеном джойнятся на четверть медленней чем нормальные GUIDы. Это, конечно, лучше чем в 2.4 раза, НО все же не сказать чтобы "незначительно".
таки смотреть характеристики серверов? ибо у меня разница максимум 10% в среднем 2-4% , правда я делаю не в tempdb.
...
Рейтинг: 0 / 0
17.01.2018, 14:02
    #39585807
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
А вот какой смысл колейшн для гуида указывать кирилицу а не латынь?
...
Рейтинг: 0 / 0
17.01.2018, 14:08
    #39585809
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
CammomileА вот какой смысл колейшн для гуида указывать кирилицу а не латынь?
там нет тайного смысла, он написал первый попавшийся binary
...
Рейтинг: 0 / 0
17.01.2018, 15:49
    #39585914
04cf9f9576a6f15
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поясните про скорость соединений
CammomileА вот какой смысл колейшн для гуида указывать кирилицу а не латынь?Его вообще нет смысла хранить в виде символьной строки.
Код: sql
1.
2.
3.
4.
DECLARE @b UNIQUEIDENTIFIER = NEWID();
DECLARE @c CHAR(36) = @b;

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


1636
#Хэш=
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поясните про скорость соединений / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]