Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ускоряющая денормализация / 24 сообщений из 24, страница 1 из 1
24.11.2017, 10:52:36
    #39558809
Itille
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
Простой пример.
Имеется 2 таблицы, 1 ко многим
T1
Id1 int primary key
N1 varchar(500)

T2
Id2 int primary key
Id1 int
Data datetime
Rekv1, Rekv2 и т.д.

На момент времени @Data1 необходимо иметь значения реквизитов T2 для всех ID по таблице T1

В лоб, без денормализации, это решается UDF с 3 Join T2 самой на себя

Select * from T2 T JOIN
(Select Id1, Max(Id2) as Id2
from T2 A JOIN
( Select Id1, Max(Data) as Data from T2 Where Data < @Data1 Group by id1) B On A.Id1 = B.Id1 and A.Data = B.Data)
group by A.Id2
)M On T.Id1 = M.Id1 and T.Id2 = M.Id2

с индексом по T2: Id1 + Data

Пример - договора и доп. соглашения.

При большом количестве данных нагрузка может быть значительна.
Может, у кого-нибудь есть альтернативные реализации структуры, пусть и ненормализованные?
...
Рейтинг: 0 / 0
24.11.2017, 11:02:53
    #39558824
WarAnt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
Itille,

Для какой версии сиквела?
...
Рейтинг: 0 / 0
24.11.2017, 11:07:18
    #39558829
Itille
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
MS SQL 2012. Но если есть в 2016, то расскажите или киньте ссылку, лишним не будет.
...
Рейтинг: 0 / 0
24.11.2017, 11:08:40
    #39558831
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
Itille,
Код: sql
1.
select top(1) with ties * from T2 where Data < @Data1 order by ROW_NUMBER() over(partition by Id1 order by Data desc) asc
...
Рейтинг: 0 / 0
24.11.2017, 11:11:38
    #39558834
WarAnt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
ItilleMS SQL 2012. Но если есть в 2016, то расскажите или киньте ссылку, лишним не будет.

тогда изайте LAST_VALUE
...
Рейтинг: 0 / 0
24.11.2017, 11:33:23
    #39558854
Itille
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
buser, спасибо!
...
Рейтинг: 0 / 0
24.11.2017, 14:26:15
    #39559047
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
Itille,

без сортировки, похоже, не обойтись. Если селективность запроса низкая, т.е. T1 содержит большой объем данных, то Вам поможет только прокачка "железа".
Кластерный индекс по t2.Data тоже бы помог, но это не подходит, судя по структуре.

Попробуйте составить календарь заранее просчитать суммы на каждый день (та самая "денормализация"). Отчет летать будет.
...
Рейтинг: 0 / 0
06.12.2017, 13:52:35
    #39565048
Itille
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
buser, посмотрел, немного не так, правильно:

select top(1) with ties * from T2 where Data < @Data1 order by ROW_NUMBER() over(partition by Id1 order by Data desc, Id2 desc) asc

в Вашем запросе не учтена возможность 2 записей с одинаковой датой.
Всё равно, спасибо!
...
Рейтинг: 0 / 0
06.12.2017, 14:17:37
    #39565079
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
Itillebuser, посмотрел, немного не так, правильно:

select top(1) with ties * from T2 where Data < @Data1 order by ROW_NUMBER() over(partition by Id1 order by Data desc, Id2 desc) asc

в Вашем запросе не учтена возможность 2 записей с одинаковой датой.
Всё равно, спасибо!А в вашем учтена, да?
Думаю, вам надо заменить ROW_NUMBER() на RANK()
...
Рейтинг: 0 / 0
06.12.2017, 14:59:21
    #39565139
Itille
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
iap, согласен,что не указал, что ID2 identity(1б1)
...
Рейтинг: 0 / 0
06.12.2017, 15:03:14
    #39565143
Itille
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
iap,p, согласен,что не указал, что ID2 identity(1,1)

Кстати, поигрался на реальных данных, есть ощущение, что конструкция из 3 join работает несколько быстрее...
...
Рейтинг: 0 / 0
06.12.2017, 22:54:55
    #39565451
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
Itille, да, очень даже может быть... а вот еще вопрос - назачем Max(Id2) в купе с Max(Data)? БардачЁк в данных или бизнеспроцессах? Или просто перестраховка?
...
Рейтинг: 0 / 0
07.12.2017, 04:23:01
    #39565500
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
ItilleНа момент времени @Data1 необходимо иметь значения реквизитов T2 для всех ID по таблице T1

А зачем нам в данном случае T1?
Там нет интересующих вас данных.
Почему нельзя взять ID из T2.Id1
...
Рейтинг: 0 / 0
07.12.2017, 04:25:29
    #39565501
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
Дошло. "Доп соглашений" может и не быть...
Но в Т1 нет и даты...
...
Рейтинг: 0 / 0
07.12.2017, 08:13:15
    #39565522
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
Всё. Совсем дошло.
Вывести все допсоглашения по всем договорам в которых есть допсоглашения до @Data1
...
Рейтинг: 0 / 0
07.12.2017, 08:17:52
    #39565524
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
В качестве ненормализованного бреда.
Заведи в T1 дополнительное поле "Дата последнего допсоглашения"
И получится один Update и один Select c одним join
...
Рейтинг: 0 / 0
07.12.2017, 08:50:56
    #39565543
Itille
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
buser, данные ведутся от царя гороха, плюс пользователи бывают замечательные, есть ограничения на редактирование записей ( в течение суток от создания), после чего вменяется для корректировки создавать новую запись.
...
Рейтинг: 0 / 0
07.12.2017, 09:23:58
    #39565560
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Select * 
   from T2 T 
   JOIN (Select Id1, Max(Id2) as Id2 
           from T2 A 
                JOIN ( Select Id1, Max(Data) as Data from T2 Where Data < @Data1 Group by id1) B On A.Id1 = B.Id1 and A.Data = B.Data)
           group by A.Id2 ) M On T.Id1 = M.Id1 and T.Id2 = M.Id2

-- эквивалент
Select m.* 
   from ( select distinct Id1, Id2 from T2 ) as T 
   cross apply ( select top(1) * from T2 Where Data < @Data1 and Id1 = T.Id1 and Id2 = T.Id2 order by Data desc, Id2 desc ) as m

-- из которого видно, насколько идиотичен исходный запрос (обработка ВСЕЙ таблицы, когда реально надо только часть )
-- для ускорения 
-- select distinct Id1, Id2 from T2 
-- можно материализовать (Indexed View)
...
Рейтинг: 0 / 0
07.12.2017, 15:46:20
    #39565984
Itille
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
aleks222, во - первых, Ваш запрос неправильный.

Правильно -

Select m.*
from ( select distinct Id1 from T2 ) as T
cross apply ( select top(1) * from T2 Where Data < @Data1 and Id1 = T.Id1 order by Data desc, Id2 desc ) as m

А во-вторых, мне не очень нравится order by внутри функции.

Вариант buser больше по душе
...
Рейтинг: 0 / 0
07.12.2017, 16:06:26
    #39566013
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
Itillealeks222, во - первых, Ваш запрос неправильный.

Правильно -

Select m.*
from ( select distinct Id1 from T2 ) as T
cross apply ( select top(1) * from T2 Where Data < @Data1 and Id1 = T.Id1 order by Data desc, Id2 desc ) as m

А во-вторых, мне не очень нравится order by внутри функции.

Вариант buser больше по душеВнутри какой-такой функции?

Вижу не ORDER BY, а TOP(1) ... ORDER BY.
...
Рейтинг: 0 / 0
07.12.2017, 16:14:26
    #39566025
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
WarAntItilleMS SQL 2012. Но если есть в 2016, то расскажите или киньте ссылку, лишним не будет.

тогда изайте LAST_VALUE

А оно быстрее аплая с TOP (1) ORDER... DESC ?

Ни разу не пользовался такой штукой.
...
Рейтинг: 0 / 0
07.12.2017, 16:21:18
    #39566032
Itille
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
iap, я имел в виду подзапрос.

Сейчас поэксперементировал.
Могу сказать, что на реальных данных время выполнения хуже, чем даже у запроса в первом посте.
Где-то в 2-3 раза на 1 млн. записей.
Но это на конкретном массиве записей с конкретными значениями.
В принципе, сам вариант имеет право на существование.
...
Рейтинг: 0 / 0
07.12.2017, 16:30:29
    #39566039
Itille
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
На самом деле, есть подозрение, что все вышеприведенные варианты по эффективности зависят от среднего количества строк в таблице t2 на каждое значение t1.
Вышенаписанное (в предыдущем моем топике) верно для среднего значения около 2.
...
Рейтинг: 0 / 0
07.12.2017, 18:22:13
    #39566145
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускоряющая денормализация
Itillealeks222, во - первых, Ваш запрос неправильный.

Правильно -

Select m.*
from ( select distinct Id1 from T2 ) as T
cross apply ( select top(1) * from T2 Where Data < @Data1 and Id1 = T.Id1 order by Data desc, Id2 desc ) as m

А во-вторых, мне не очень нравится order by внутри функции.

Вариант buser больше по душе

Дык, страдалец, ты меня пугаешь своей замороченностью.

Код: sql
1.
2.
3.
Select m.* 
   from T1 as T 
   cross apply ( select top(1) * from T2 Where Data < @Data1 and Id1 = T.Id1 order by Data desc, Id2 desc ) as m


+ индекс T2(Id1, Data, Id2)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ускоряющая денормализация / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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