|
|
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
Простой пример. Имеется 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 Пример - договора и доп. соглашения. При большом количестве данных нагрузка может быть значительна. Может, у кого-нибудь есть альтернативные реализации структуры, пусть и ненормализованные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 10:52:36 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
Itille, Для какой версии сиквела? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:02:53 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
MS SQL 2012. Но если есть в 2016, то расскажите или киньте ссылку, лишним не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:07:18 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
Itille, Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:08:40 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
ItilleMS SQL 2012. Но если есть в 2016, то расскажите или киньте ссылку, лишним не будет. тогда изайте LAST_VALUE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:11:38 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
buser, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 11:33:23 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
Itille, без сортировки, похоже, не обойтись. Если селективность запроса низкая, т.е. T1 содержит большой объем данных, то Вам поможет только прокачка "железа". Кластерный индекс по t2.Data тоже бы помог, но это не подходит, судя по структуре. Попробуйте составить календарь заранее просчитать суммы на каждый день (та самая "денормализация"). Отчет летать будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2017, 14:26:15 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
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 записей с одинаковой датой. Всё равно, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 13:52:35 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
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() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 14:17:37 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
iap, согласен,что не указал, что ID2 identity(1б1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 14:59:21 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
iap,p, согласен,что не указал, что ID2 identity(1,1) Кстати, поигрался на реальных данных, есть ощущение, что конструкция из 3 join работает несколько быстрее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 15:03:14 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
Itille, да, очень даже может быть... а вот еще вопрос - назачем Max(Id2) в купе с Max(Data)? БардачЁк в данных или бизнеспроцессах? Или просто перестраховка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 22:54:55 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
ItilleНа момент времени @Data1 необходимо иметь значения реквизитов T2 для всех ID по таблице T1 А зачем нам в данном случае T1? Там нет интересующих вас данных. Почему нельзя взять ID из T2.Id1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 04:23:01 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
Дошло. "Доп соглашений" может и не быть... Но в Т1 нет и даты... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 04:25:29 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
Всё. Совсем дошло. Вывести все допсоглашения по всем договорам в которых есть допсоглашения до @Data1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 08:13:15 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
В качестве ненормализованного бреда. Заведи в T1 дополнительное поле "Дата последнего допсоглашения" И получится один Update и один Select c одним join ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 08:17:52 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
buser, данные ведутся от царя гороха, плюс пользователи бывают замечательные, есть ограничения на редактирование записей ( в течение суток от создания), после чего вменяется для корректировки создавать новую запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 08:50:56 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 09:23:58 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
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 больше по душе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 15:46:20 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 16:06:26 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
WarAntItilleMS SQL 2012. Но если есть в 2016, то расскажите или киньте ссылку, лишним не будет. тогда изайте LAST_VALUE А оно быстрее аплая с TOP (1) ORDER... DESC ? Ни разу не пользовался такой штукой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 16:14:26 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
iap, я имел в виду подзапрос. Сейчас поэксперементировал. Могу сказать, что на реальных данных время выполнения хуже, чем даже у запроса в первом посте. Где-то в 2-3 раза на 1 млн. записей. Но это на конкретном массиве записей с конкретными значениями. В принципе, сам вариант имеет право на существование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 16:21:18 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
На самом деле, есть подозрение, что все вышеприведенные варианты по эффективности зависят от среднего количества строк в таблице t2 на каждое значение t1. Вышенаписанное (в предыдущем моем топике) верно для среднего значения около 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 16:30:29 |
|
||
|
Ускоряющая денормализация
|
|||
|---|---|---|---|
|
#18+
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. + индекс T2(Id1, Data, Id2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:22:13 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=175&tid=1690725]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
60ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
5ms |
| others: | 239ms |
| total: | 425ms |

| 0 / 0 |
