Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
737 / 527 / 130
Регистрация: 31.05.2013
Сообщений: 2,975
Записей в блоге: 3
1

Разъяснение GUID

30.09.2019, 12:17. Показов 2172. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Для того что бы понять, на сколько «медленнее» работать с GUID, создал три таблицы, где в качестве индекса использовал int и bigint (автоинкрименты) , а так же GUID. И Заполнил их по ляму записей.


SQL
1
2
3
4
5
6
7
8
9
10
11
DECLARE @i AS INT = 0
DECLARE @a AS nvarchar(250) = 'string'
 
WHILE (@i < 1000000)
  BEGIN 
      SET @i = @i +1
      SET @a = @a + CONVERT(nvarchar(250), @i)
      INSERT INTO grid_id VALUES(@a)                 --Для инкримента  
      --INSERT INTO grid_64_id values(@a)            --Для инкримента  BIG
      --INSERT INTO grid_guid values(NEWID(), @a)    --Для GUID
  END
На мое удивление, миллион строк GUID создалось быстрее всего.

Ну и собсвевено сам вопрос, почему все таблицы весят одинаково, ведь объем индексов другой?

Спасибо.
Миниатюры
Разъяснение  GUID  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2019, 12:17
Ответы с готовыми решениями:

GUID
Подскажите пожалуйста, как использовать ГУИД. Вот так не получается. Как правильно? INSERT...

Автогенерация GUID
В качестве ключевого поля используем guid. Есть ли для него какая-либо автогенерация?

GUID как кластерный индекс и Insert
Добрый день!!! Если задать в качестве кластерного индекса GUID и сделать insert (при этом...

Как программно в базу MS SQL2000 вставить GUID ?
В базе данных в таблице MYTABLE имеется поле &lt;IDGUIOD&gt; которое имеет формат uniqueidentifier т.е....

7
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
30.09.2019, 12:58 2
Цитата Сообщение от Dinkin Посмотреть сообщение
На мое удивление, миллион строк GUID создалось быстрее всего.
Что пытаетесь измерить вставляя по одной строке за раз, да еще постоянно наращивая объем вставляемых данных?
Цитата Сообщение от Dinkin Посмотреть сообщение
Ну и собсвевено сам вопрос, почему все таблицы весят одинаково, ведь объем индексов другой?
Потому что на самом деле это кучи и никаких индексов на них нет. Ибо чудес не бывает.
0
737 / 527 / 130
Регистрация: 31.05.2013
Сообщений: 2,975
Записей в блоге: 3
30.09.2019, 14:12  [ТС] 3
Цитата Сообщение от invm Посмотреть сообщение
Что пытаетесь измерить вставляя по одной строке за раз, да еще постоянно наращивая объем вставляемых данных?
Хотел Получить время выполнения операции вставки на примере ляма записей. А строку наращивал просто для изменения, чтобы потом сделать различные выборки.

Цитата Сообщение от invm Посмотреть сообщение
Потому что на самом деле это кучи и никаких индексов на них нет. Ибо чудес не бывает.
Ну а ведь типы данных имеют разный размер, тогда же ведь одна таблица должна занимать меньше памяти, другие больше, или нет?
0
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
30.09.2019, 14:39 4
Цитата Сообщение от Dinkin Посмотреть сообщение
Хотел Получить время выполнения операции вставки на примере ляма записей.
по одной? зарадидля?
0
737 / 527 / 130
Регистрация: 31.05.2013
Сообщений: 2,975
Записей в блоге: 3
30.09.2019, 14:51  [ТС] 5
Цитата Сообщение от pincet Посмотреть сообщение
по одной? зарадидля?
Ну так я хотел протестировать приближенное к реальному, когда будет вставляться по однойстроке в масиве лям запросов.

Добавлено через 3 минуты
Просто у меня сомнения, почему то ни в одном тесте на скорость выборки, вставки или джойны, GUID не уступает инкриментам...но ведь так не должно же быть...я явно что то ни так делаю
0
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
30.09.2019, 15:38 6
Лучший ответ Сообщение было отмечено Dinkin как решение

Решение

Цитата Сообщение от Dinkin Посмотреть сообщение
Ну так я хотел протестировать приближенное к реальному, когда будет вставляться по однойстроке в масиве лям запросов.
Когда вставляете по одной строке в режиме auto commit, 99% затрат времени уходит на запись в журнал транзакций. Поэтому такое тестирование бессмысленно.
Более того, сравнивать время вставки строк вообще бессмысленно.
Цитата Сообщение от Dinkin Посмотреть сообщение
Просто у меня сомнения, почему то ни в одном тесте на скорость выборки, вставки или джойны, GUID не уступает инкриментам...но ведь так не должно же быть...я явно что то ни так делаю
Тестировать нужно правильно и с разными стратегиями соединения (hash, loop и merge)
В общем, вот вам тест, - развлекайтесь:
T-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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use tempdb;
go
 
create table dbo.t1 (i int not null, bi bigint not null, ui uniqueidentifier not null);
create table dbo.t2 (i int not null, bi bigint not null, ui uniqueidentifier not null);
 
insert into dbo.t1
 (i, bi, ui)
 select top (500000)
  row_number() over (order by 1/0), row_number() over (order by 1/0), newid()
 from
  master.dbo.spt_values a cross join
  master.dbo.spt_values b;
 
insert into dbo.t2 with (tablock)
 (i, bi, ui)
 select
  i, bi, ui
 from
  dbo.t1;
 
create unique index IX_t1__i on dbo.t1 (i);
create unique index IX_t1__bi on dbo.t1 (bi);
create unique index IX_t1__ui on dbo.t1 (ui);
 
create unique index IX_t2__i on dbo.t2 (i);
create unique index IX_t2__bi on dbo.t2 (bi);
create unique index IX_t2__ui on dbo.t2 (ui);
go
 
declare
 @q1 nvarchar(max) = N'/*q1*/declare @c int; select @c = count(*) from dbo.t1 a join dbo.t2 b on b.i = a.i option (maxdop 1, hash join)',
 @q2 nvarchar(max) = N'/*q2*/declare @c int; select @c = count(*) from dbo.t1 a join dbo.t2 b on b.bi = a.bi option (maxdop 1, hash join)',
 @q3 nvarchar(max) = N'/*q3*/declare @c int; select @c = count(*) from dbo.t1 a join dbo.t2 b on b.ui = a.ui option (maxdop 1, hash join)',
 @q4 nvarchar(max) = N'/*q4*/declare @c int; select @c = count(*) from dbo.t1 a join dbo.t2 b on b.i = a.i option (maxdop 1, loop join)',
 @q5 nvarchar(max) = N'/*q5*/declare @c int; select @c = count(*) from dbo.t1 a join dbo.t2 b on b.bi = a.bi option (maxdop 1, loop join)',
 @q6 nvarchar(max) = N'/*q6*/declare @c int; select @c = count(*) from dbo.t1 a join dbo.t2 b on b.ui = a.ui option (maxdop 1, loop join)',
 @q7 nvarchar(max) = N'/*q7*/declare @c int; select @c = count(*) from dbo.t1 a join dbo.t2 b on b.ui = a.ui option (maxdop 1, merge join)',
 @q8 nvarchar(max) = N'/*q8*/declare @c int; select @c = count(*) from dbo.t1 a join dbo.t2 b on b.bi = a.bi option (maxdop 1, merge join)',
 @q9 nvarchar(max) = N'/*q9*/declare @c int; select @c = count(*) from dbo.t1 a join dbo.t2 b on b.ui = a.ui option (maxdop 1, merge join)';
 
declare @qd table (id int, query_description nvarchar(50), query_mask nvarchar(30))
insert into @qd
values
 (1, N'Hash join by int', N'/*q1*/%'),
 (2, N'Hash join by bigint', N'/*q2*/%'),
 (3, N'Hash join by uniqueidentifier', N'/*q3*/%'),
 (4, N'Loop join by int', N'/*q4*/%'),
 (5, N'Loop join by bigint', N'/*q5*/%'),
 (6, N'Loop join by uniqueidentifier', N'/*q6*/%'),
 (7, N'Merge join by int', N'/*q7*/%'),
 (8, N'Merge join by bigint', N'/*q8*/%'),
 (9, N'Merge join by uniqueidentifier', N'/*q9*/%');
 
declare @c int = 5;
 
while @c > 0
 begin
  exec sys.sp_executesql @q1;
  exec sys.sp_executesql @q2;
  exec sys.sp_executesql @q3;
  exec sys.sp_executesql @q4;
  exec sys.sp_executesql @q5;
  exec sys.sp_executesql @q6;
  exec sys.sp_executesql @q7;
  exec sys.sp_executesql @q8;
  exec sys.sp_executesql @q9;
 
  set @c -= 1;
 end;
 
select
 qd.query_description, qs.execution_count, qs.total_elapsed_time,
 cast(cast(qs.total_elapsed_time as float) / qs.execution_count  as numeric(18,2)) as avg_elapsed_time,
 cast(cast(qs.total_logical_reads as float) / qs.execution_count  as numeric(18,2)) as avg_logical_reads,
 qp.query_plan
from
 sys.dm_exec_query_stats qs cross apply
 sys.dm_exec_query_plan(qs.plan_handle) qp cross apply
 sys.dm_exec_sql_text(qs.sql_handle) st join
 @qd qd on st.text like qd.query_mask
order by
 qd.id
option
 (recompile);
go
 
drop table dbo.t1, dbo.t2;
go
1
737 / 527 / 130
Регистрация: 31.05.2013
Сообщений: 2,975
Записей в блоге: 3
30.09.2019, 15:59  [ТС] 7
invm, огромное спасибо
0
737 / 527 / 130
Регистрация: 31.05.2013
Сообщений: 2,975
Записей в блоге: 3
02.10.2019, 10:12  [ТС] 8
Несколько дней теста...как я понял, что uniqueidentifier незначительно проигрывает в выборках и джойнах.
0
02.10.2019, 10:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2019, 10:12
Помогаю со студенческими работами здесь

Создание скрипта, который запишет в таблицу 10 млн записей с Guid
Помогите создать на SQL такой скрипт, который запишет в таблицу 10 млн записей с Guid.

Подскажите способ преобразования GUID строчки в GUID тип
Создать GUID и преобразовать в строку легко, а как сделать обратно?

Разъяснение
Ребят, может кто-то сможет объяснить новичку в данном языке программирования, что требуется сделать...

Разъяснение по ТЗ
Доброго времени суток, суть вопроса состоит в том что бы вы помогли мне разобраться с данным ТЗ....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru