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

Откуда:
Сообщений: 120
Кто пробовал тесты на MS SQL 12?

Вариант 1:
1. Запись в t1 (f1,f2,f3,f4,f5,f6,f7,f8) 1.000.000.000 строк
2. Есть t2 (f1,f2,f3), в которую по trigger по принципу MERGE происходит запись этих строк
3.
select f1,f2,f3 from t2


Вариант 2:
1. Запись в t1 (f1,f2,f3,f4,f5,f6,f7,f8) 1.000.000.000 строк
2.
select distinct f1,f2,f3 from t1


Вопрос: Что быстрее отработает?

P.S. Понимаю что быстрее наверное самому провести тесты, но может кто уже проверял)

А может есть еще какие интересные варианты?
28 июн 16, 15:00    [19345786]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
invm
Member

Откуда: Москва
Сообщений: 9632
НиколайСН
А может есть еще какие интересные варианты?
Индексированное представление.
28 июн 16, 15:04    [19345814]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
1. При чём тут MERGE?
2. Глядя на второй запрос: а зачем вообще вторая таблица?
3. Какой смысл сравнивать INSERT+SELECT с простым SELECTом??
28 июн 16, 15:13    [19345876]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
iap
1. При чём тут MERGE?
2. Глядя на второй запрос: а зачем вообще вторая таблица?
3. Какой смысл сравнивать INSERT+SELECT с простым SELECTом??


1. Как причем? А как я тебе получу уникальность строк в t2 с полями f1,f2,f3? merge сильный и мощный инструмент, но к сожалению Медленный.
2. Опять же - что бы из нее начитать уникальные строки, и не юзать медленный DISTINCT
3. Тут не просто "INSERT+SELECT с простым SELECTом??"
Тут MERGE+SELECT против SELECT DISTINCT
28 июн 16, 15:19    [19345916]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
а быть точнее по вопросу 3:
(insert + trg "merge") + Select против select distinct
28 июн 16, 15:22    [19345949]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
msLex
Member

Откуда:
Сообщений: 8694
НиколайСН
iap
1. При чём тут MERGE?
2. Глядя на второй запрос: а зачем вообще вторая таблица?
3. Какой смысл сравнивать INSERT+SELECT с простым SELECTом??


1. Как причем? А как я тебе получу уникальность строк в t2 с полями f1,f2,f3? merge сильный и мощный инструмент, но к сожалению Медленный.
2. Опять же - что бы из нее начитать уникальные строки, и не юзать медленный DISTINCT
3. Тут не просто "INSERT+SELECT с простым SELECTом??"
Тут MERGE+SELECT против SELECT DISTINCT

Перед мержем записей в таблицу их вообще-то тоже нужно уникализировать.
Или вы собираетесь мержить по одной записи?
28 июн 16, 15:23    [19345951]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
msLex,

"уникализировать" возможности НЕТ, т.к. это громадный массив данных, записываемый в Куб.
Уникализировать его через temp tables - это же самоубийство, ибо при увеличении за 500 т. строк sql server увеличивает время в геометрической прогрессии(
28 июн 16, 15:26    [19345977]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
НиколайСН,

а чем INSERT ... SELECT ... WHERE NOT EXISTS(SELECT * FROM ....) не подходит.
Ничего же не апдейтится, как я понимаю.

В одном случае время на отбор уникальных троек (f1,f2,f3) увеличивается за счёт вставки в лишнюю таблицу,
но "размазывается" за пределами SELECTа. И поэтому сам SELECT кажется более лёгким.
Во втором случае выборка SELECTом усложняется, но без лишнего INSERTа и лишней таблицы.
При этом неизвестно, есть ли, например, индекс по f1,f2,f3
или выборка уникальных троек производится сканированием всей таблицы?
28 июн 16, 15:29    [19345990]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
msLex
Member

Откуда:
Сообщений: 8694
НиколайСН
msLex,

"уникализировать" возможности НЕТ, т.к. это громадный массив данных, записываемый в Куб.
Уникализировать его через temp tables - это же самоубийство, ибо при увеличении за 500 т. строк sql server увеличивает время в геометрической прогрессии(

Нет, вы не поняли, это не совет, без такой уникализации вы в лучшем случае получите в target те же неуникальные значения, что и в source, а в худшем ошибку "двойного апдейта"

create table #source(a int, b int, c int, f int)

create table #target(a int, b int, c int, f int)




insert #source (
	a
	, b
	, c
)
select 
	1
	, 1
	, 1
union all
select 
	1
	, 1
	, 1


/*тут вставятся две неуникальные записи*/
merge #target as t 
using #source as s 	on 
	t.a = s.a
	and t.b = s.b
	and t.c = s.c
when not matched by target then
	insert (
		a
		, b
		, c
	)
	values (
		s.a
		, s.b
		, s.c
	)
	when matched then 
		update set
			t.f = s.f
;

/*а тут тут будет ошибка "двойного" апдейта записи*/
merge #target as t 
using #source as s 	on 
	t.a = s.a
	and t.b = s.b
	and t.c = s.c
when not matched by target then
	insert (
		a
		, b
		, c
	)
	values (
		s.a
		, s.b
		, s.c
	)
	when matched then 
		update set
			t.f = s.f
;
28 июн 16, 15:39    [19346075]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
msLex,

а где разница между запросом 1 и запросом 2? Они вроде одинаковые "один в один". Либо я после 5-ого раза прочтения не заметил разницы)
28 июн 16, 16:21    [19346371]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
НиколайСН
msLex,

а где разница между запросом 1 и запросом 2? Они вроде одинаковые "один в один". Либо я после 5-ого раза прочтения не заметил разницы)
Одинаковые. Но если их выполнить один за другим, то первый вставит, а второй попытается проапдейтить.
28 июн 16, 16:22    [19346376]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
msLex,
iap,

а если так?
drop table #source
drop table #target


-- Таблица Источник
create table #source(a int, b int, c int, d int, e int, f int, g int, val int
CONSTRAINT [PK_source] PRIMARY KEY CLUSTERED 
(
	a ASC,
	b ASC,
	c ASC,
	d ASC,
	e ASC,
	f ASC,
	g ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY];


create table #target(a int, b int, c int,
CONSTRAINT [PK_target] PRIMARY KEY CLUSTERED 
(
	a ASC,
	b ASC,
	c ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY];




insert #source (
	a
	, b
	, c
	, d
	, e
	, f
	, g
	, val
)
select 
	1
	, 1
	, 1
	, 1
	, 1
	, 1
	, 1
	, 500
union all
select 
	1
	, 1
	, 1
	, 1
	, 1
	, 1
	, 222
	, 700
;


/*тут вставятся две неуникальные записи*/
merge #target as t 
using 
	(select distinct a,b,c from #source) s
on 
	t.a = s.a
	and t.b = s.b
	and t.c = s.c
when not matched then
	insert (
		a
		, b
		, c
	)
	values (
		s.a
		, s.b
		, s.c
	)
;

/*а тут тут будет ошибка "двойного" апдейта записи*/
merge #target as t 
using 
	(select distinct a,b,c from #source) s
on 
	t.a = s.a
	and t.b = s.b
	and t.c = s.c
when not matched then
	insert (
		a
		, b
		, c
	)
	values (
		s.a
		, s.b
		, s.c
	)
;

select * from #source
select * from #target
28 июн 16, 16:52    [19346555]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
msLex
Member

Откуда:
Сообщений: 8694
НиколайСН
а если так?


ну так вы же сравнивали merge VS distinct, а получили
distinct+merge vs distinct
28 июн 16, 16:54    [19346577]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
msLex
НиколайСН
а если так?


ну так вы же сравнивали merge VS distinct, а получили
distinct+merge vs distinct


я понял ошибку/нюанс.
За это спасибо большое,

НО!
к сожалению, я выбираю в1 (merge+distinct) по следующим причинам:
1. в1 увеличивает время на этапе "записи" в #target(и #source), что лично мне не критично, Ибо это увеличит время для одного пользователя, который ТОЛЬКО грузит данные.
2. в2 не совсем подходит, т.к. таблица будет расти и дальше, а так же "этот" запрос будет отрабатывать при каждом открытии разрабатываемого отчета, что не камильфо, ибо будет запрос отрабатываться каждый раз при обновлении/открытии отчета..


По-этому вывод:
приходится выбирать из 2-х жертв:
1. временем на загрузку
2. временем на открытие/обновление отчетов.

Тут уже, так сказать, каждый выбирает сам что ему подходит больше).
28 июн 16, 17:02    [19346643]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
msLex
Member

Откуда:
Сообщений: 8694
Так вы выбираете не между единоразовым merge и единоразовым select а между множественными merge и одним select

тогда вы изначально смотрите не на те (а точнее не на все) цифры
вопрос не только в количестве записей в t1, которое в первую очередь влияет на вариант select distinct, но в количестве новых данных в t1 в единицу времени, что влияет на merge.

ну и естественно сравнение совсем некорректно т.к. для начала нужно знать
1. соотношение чтений/вставок
2. что хуже, замедлить на 1 секунду 100 вставок, или на 100 секунд 1 чтение
28 июн 16, 17:10    [19346691]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
msLex
Так вы выбираете не между единоразовым merge и единоразовым select а между множественными merge и одним select


Интересно, при вставке пула данных в таблицу и настроенном триггере - данный MERGE выполнится в триггере ОДИН раз, а не множество раз. Это же ms sql, а не Oracle или другие, которые отрабатывают построчно, в то время как ms отрабатывает триггер целым пулом данных! Или я ошибаюсь?

msLex
ну и естественно сравнение совсем некорректно т.к. для начала нужно знать
1. соотношение чтений/вставок
2. что хуже, замедлить на 1 секунду 100 вставок, или на 100 секунд 1 чтение


1.
Данные грузятся 1-5 раз в месяц.
А вот пользователей тонны!

2. Наверное лучше заставить подождать 5-100 секунд Загружающих данные, чем заставить ждать 1000 пользователей, т.к. отчет будет выполняться и открываться, при этом отрабатывая select distinct из всего пула данных при каждом обновлении.
28 июн 16, 17:20    [19346773]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
msLex
Member

Откуда:
Сообщений: 8694
НиколайСН,

Если у вас данные загружаются редко, а получать их нужно часто быстро, то конечно лучше саггрегировать и проиндексировать данные в момент загрузки.
28 июн 16, 17:23    [19346799]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
msLex
Member

Откуда:
Сообщений: 8694
НиколайСН
Интересно, при вставке пула данных в таблицу и настроенном триггере - данный MERGE выполнится в триггере ОДИН раз, а не множество раз. Это же ms sql, а не Oracle или другие, которые отрабатывают построчно, в то время как ms отрабатывает триггер целым пулом данных! Или я ошибаюсь?

Да, в mssql триггеры срабатывают постейтментно а не построчно.
28 июн 16, 17:24    [19346808]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
invm
НиколайСН
А может есть еще какие интересные варианты?
Индексированное представление.


только дисками для лога запастись надо.
28 июн 16, 17:26    [19346817]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
НиколайСН

А может есть еще какие интересные варианты?


Напишите код на C++, который будет читать входной поток данных и проверять нет ли такой комбинации f1 f2 f3 в хеш-таблице, которая сидит в памяти. Зависит от кол-ва ожидаемых комбинаций.
28 июн 16, 17:29    [19346845]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
a_voronin
invm
пропущено...
Индексированное представление.


только дисками для лога запастись надо.


Ты не поверишь, ВСЁ это - для формирования параметризованного справочника, где из примера Поста№1 запрос будет типа:
select f1 where f2 in ()


Проблема в том, что in () может выходить за рамки sql запросов, и для минимизации этого перечисления IN и задумывается вся эта хитрая идея!!!

А логировать на всём этом этапе ничего не надо, ибо одних данных уже 10-ки террабайтов) а эта задея - капля в море)
28 июн 16, 17:33    [19346865]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
a_voronin
НиколайСН
А может есть еще какие интересные варианты?


Напишите код на C++, который будет читать входной поток данных и проверять нет ли такой комбинации f1 f2 f3 в хеш-таблице, которая сидит в памяти. Зависит от кол-ва ожидаемых комбинаций.


Не могу! Я работаю с BI-платформой и уже адаптируюсь под её механизмы формирований sql-запросов и пытаюсь под неё подстроиться, ибо если ты готов заняться разработкой самой BI-платформы, я готов вложиться в дело))
28 июн 16, 17:35    [19346871]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
msLex,

Спасибо большое за разъяснения и примеры.
Я даже и не подумал про "двойной апдейт", если честно - не сталкивался никогда с этим)
Буду знать!

Спасибо всем!
Тему можно закрывать!
28 июн 16, 17:37    [19346875]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
НиколайСН
a_voronin
пропущено...


Напишите код на C++, который будет читать входной поток данных и проверять нет ли такой комбинации f1 f2 f3 в хеш-таблице, которая сидит в памяти. Зависит от кол-ва ожидаемых комбинаций.


Не могу! Я работаю с BI-платформой и уже адаптируюсь под её механизмы формирований sql-запросов и пытаюсь под неё подстроиться, ибо если ты готов заняться разработкой самой BI-платформы, я готов вложиться в дело))


Что за платформа?
28 июн 16, 18:25    [19347106]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее отработает на 1.000.000.000.000 строках: Merge (trigger) или Distinct  [new]
invm
Member

Откуда: Москва
Сообщений: 9632
a_voronin
только дисками для лога запастись надо.
Что, потребление ЖТ будет выше варианта с триггером?
28 июн 16, 18:26    [19347116]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить