powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поясните про скорость соединений
25 сообщений из 26, страница 1 из 2
Поясните про скорость соединений
    #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
Поясните про скорость соединений
    #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
Поясните про скорость соединений
    #39585272
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы ставил на разницу в длинне, но может есть и более весомые аргументы
...
Рейтинг: 0 / 0
Поясните про скорость соединений
    #39585274
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ты что? Varchar - самый медленный join. В GUID 16 байт строго, а строка у тебя в 2 раза больше і к тому же переменной длінны. Даже не зная фізіку процесса, можно обоснованно предположіть, что...
...
Рейтинг: 0 / 0
Поясните про скорость соединений
    #39585282
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДЫк я понимаю что в два раза больше. Просто на всяких "технетах" и "скульблогах" (уже не найду) писали, что разница незначительна.

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

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


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

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

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


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

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

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

#Хэш=
...
Рейтинг: 0 / 0
Поясните про скорость соединений
    #39585335
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не решил.
Это коллега Шифл сделал предположение, что вариативность варчара сказывается на скорости. На самом деле нет.
...
Рейтинг: 0 / 0
Поясните про скорость соединений
    #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
Поясните про скорость соединений
    #39585350
04cf9f9576a6f15
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileЯ не решил.
Это коллега Шифл сделал предположение, что вариативность варчара сказывается на скорости. На самом деле нет.Сказывается, да. Зависит от нюансов. Например, у варчара из-за вариативности свои особенности хранения на страницах, которые могут приводить к дополнительным издержкам. Зато за счёт компактности данные могут занимать меньше места и требовать меньше операций ввода-вывода.

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

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

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

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

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

#Хэш=
...
Рейтинг: 0 / 0
Поясните про скорость соединений
    #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
Поясните про скорость соединений
    #39585610
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня без указания бинарного коллейшена чар был стабильно быстрее варчара, но на крохи. Типа варчар 3600 чар 3450.
...
Рейтинг: 0 / 0
Поясните про скорость соединений
    #39585632
04cf9f9576a6f15
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgPS char стабильно медленнее varchar, запускал несколько разЗанятно.
...
Рейтинг: 0 / 0
Поясните про скорость соединений
    #39585656
Гигабайт Мегабайтович Килобайтов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
04cf9f9576a6f15alexeyvgPS char стабильно медленнее varchar, запускал несколько разЗанятно.
мож у Алексея что не то с серваком? )) у меня - примерно одинаковые 1 и 4 и примерно одинаковые 2 и 3 , т.е. бинари примерно равно guid и guid быстрее binary на проценты. char примерно равен varchar. char на доли процента быстрее varchar.
...
Рейтинг: 0 / 0
Поясните про скорость соединений
    #39585683
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Померял с колейшеном. Варчары с колейшеном джойнятся на четверть медленней чем нормальные GUIDы. Это, конечно, лучше чем в 2.4 раза, НО все же не сказать чтобы "незначительно".
...
Рейтинг: 0 / 0
Поясните про скорость соединений
    #39585691
Гигабайт Мегабайтович Килобайтов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileПомерял с колейшеном. Варчары с колейшеном джойнятся на четверть медленней чем нормальные GUIDы. Это, конечно, лучше чем в 2.4 раза, НО все же не сказать чтобы "незначительно".
таки смотреть характеристики серверов? ибо у меня разница максимум 10% в среднем 2-4% , правда я делаю не в tempdb.
...
Рейтинг: 0 / 0
Поясните про скорость соединений
    #39585807
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот какой смысл колейшн для гуида указывать кирилицу а не латынь?
...
Рейтинг: 0 / 0
Поясните про скорость соединений
    #39585809
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileА вот какой смысл колейшн для гуида указывать кирилицу а не латынь?
там нет тайного смысла, он написал первый попавшийся binary
...
Рейтинг: 0 / 0
Поясните про скорость соединений
    #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
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поясните про скорость соединений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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