powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с оптимизацией IS NOT NULL
70 сообщений из 70, показаны все 3 страниц
Проблема с оптимизацией IS NOT NULL
    #39848148
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делали тут небольшое сравнение СУБД и нарвались на вот какую проблему:

Запрос:

Код: sql
1.
SELECT COUNT(*) FROM ShipmentDetail s1, ShipmentDetail s2 WHERE s1.sd=s2.sd AND s1.id <> s2.id



План запроса:
Код: sql
1.
2.
3.
4.
5.
6.
Rows	Executes  Stmt Text
1	1	  |--Compute Scalar(DEFINE:([Expr1002]=CONVERT_IMPLICIT(int,[Expr1008],0)))
1	1	       |--Hash Match(Aggregate, HASH:() DEFINE:([Expr1008]=COUNT(*)))
0	1	            |--Nested Loops(Inner Join, OUTER REFERENCES:([s1].[id], [s1].[sd], [Expr1007]) WITH UNORDERED PREFETCH)
10000001	1	                 |--Index Scan(OBJECT:([test].[dbo].[shipmentdetail].[shipmentdetail_sd] AS [s1]))
0	10000001	                 |--Index Seek(OBJECT:([test].[dbo].[shipmentdetail].[shipmentdetail_sd] AS [s2]), SEEK:([s2].[sd]=[test].[dbo].[shipmentdetail].[sd] as [s1].[sd]),  WHERE:([test].[dbo].[shipmentdetail].[id] as [s1].[id]<>[test].[dbo].[shipmentdetail].[id] as [s2].[id]) ORDERED FORWARD)



То есть MS SQL не догадывается бежать только по не NULL значениям. При этом если добавить явно IS NOT NULL все становится хорошо. Там может нужен какой-то специальный тип индекса?

И странно что Oracle отлично разруливает эту проблему.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848161
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему вы задокументированное поведение называете проблемой? Тут нет никакой проблемы.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848181
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileА почему вы задокументированное поведение называете проблемой? Тут нет никакой проблемы.

Ну так запрос выполняется 3 секунды. А у Oracle 30мс.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848197
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oracle != mssql - запомните и дальше станет проще
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848212
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneoracle != mssql - запомните и дальше станет проще

Поверьте я это заметил. Я бы даже сказал это два антипода.

Причем, как человеку с навязчивым перфекционизмом, я очень благодарен Oracle. Потому как когда ты делаешь говно и тебя это напрягает, ты вспоминаешь что есть такая штука как Oracle и тебе становится гораздо легче.

Я когда тестировал три базы, и мне надо было что-то проверить на Oracle я понимал, что а) логику надо выключить, б) приготовиться долбаться с ним в раза 4 больше чем с остальными.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848217
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nitro_Junkie,
в статье ребята не смогли в SQL, поэтому придумали какую-то свою приблуду и попытались написать, почему в SQL всё плохо.
Те же cross apply и instead of триггеры для вьюшек как-то упустили.
Может не знали - подтверждение что "не смогли в SQL". Если знали и не описали, ибо в статью слегка ломало - то что-то другое :)
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848223
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курсоры, триггеры и развесистый pl/sql - это часто встречающийся подход в оракле, который ломается, когда вы хотите сделать так же на mssql. И, аналогично, обычные подходы из mssql часто не самые эффективные в оракле.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848224
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy stNitro_Junkie,
в статье ребята не смогли в SQL, поэтому придумали какую-то свою приблуду и попытались написать, почему в SQL всё плохо.
Те же cross apply и instead of триггеры для вьюшек как-то упустили.
Может не знали - подтверждение что "не смогли в SQL". Если знали и не описали, ибо в статью слегка ломало - то что-то другое :)

С CROSS APPLY дополнили статью. INSTEAD OF это не то в данном случае. Если вы сделаете триггер INSTEAD OF на balance, он не будет вызываться, когда скажем shipmentDetail поменялось, а там именно об этом речь шла.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848225
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы в той статье сами себя загнали в угол с такой архитектурой данных, которая не очень удобна для работы в mssql, а потом пытаетесь героически преодолеть ограничения.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848249
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_OneКурсоры, триггеры и развесистый pl/sql - это часто встречающийся подход в оракле, который ломается, когда вы хотите сделать так же на mssql. И, аналогично, обычные подходы из mssql часто не самые эффективные в оракле.

Вот это странно, потому как триггеры в MS SQL имхо сделаны лучше чем в оракл. Во всяком случае там N+1 проблему победили. И многие ораклоиды поэтому мне говорили, что стараются избегать триггеров.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848253
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneвы в той статье сами себя загнали в угол с такой архитектурой данных, которая не очень удобна для работы в mssql, а потом пытаетесь героически преодолеть ограничения.

А что там такого особенного в архитектуре. Там же просто документы/ остатки и т.п. Или вы что-то другое имеете ввиду?
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848254
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имелось ввиду как вы эти данные храните (стуктуру таблиц и их взаимосвязь)
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848269
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nitro_Junkieandy stNitro_Junkie,
в статье ребята не смогли в SQL, поэтому придумали какую-то свою приблуду и попытались написать, почему в SQL всё плохо.
Те же cross apply и instead of триггеры для вьюшек как-то упустили.
Может не знали - подтверждение что "не смогли в SQL". Если знали и не описали, ибо в статью слегка ломало - то что-то другое :)

С CROSS APPLY дополнили статью. INSTEAD OF это не то в данном случае. Если вы сделаете триггер INSTEAD OF на balance, он не будет вызываться, когда скажем shipmentDetail поменялось, а там именно об этом речь шла.
ммм...
а давайте придумаем еще еще какие-нибудь свои правила и будем радоваться, что ни одна субд их не поддерживает.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848315
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneимелось ввиду как вы эти данные храните (стуктуру таблиц и их взаимосвязь)

А как если не секрет по вашему нужно было структуру таблиц в данном случае организовывать?
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848316
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy stNitro_Junkieпропущено...


С CROSS APPLY дополнили статью. INSTEAD OF это не то в данном случае. Если вы сделаете триггер INSTEAD OF на balance, он не будет вызываться, когда скажем shipmentDetail поменялось, а там именно об этом речь шла.
ммм...
а давайте придумаем еще еще какие-нибудь свои правила и будем радоваться, что ни одна субд их не поддерживает.

Что значит придумывать правила? Допустим вам надо логировать ситуации, когда количество остатка стало меньше 0. Вроде элементарная задача, как ее при помощи INSTEAD OF триггера реализовать?
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848323
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nitro_Junkieandy stпропущено...

ммм...
а давайте придумаем еще еще какие-нибудь свои правила и будем радоваться, что ни одна субд их не поддерживает.

Что значит придумывать правила? Допустим вам надо логировать ситуации, когда количество остатка стало меньше 0. Вроде элементарная задача, как ее при помощи INSTEAD OF триггера реализовать?
а делать это на этапе добавления записи, которая может привести к остатку < 0, не?
или подразумевается, что кто-то может править содержимое вьюхи в плане изменения остатка? типа чёта мало тут, давай сотку накинем... тогда ребята правильно путём идут бизнес делать.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848336
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy stNitro_Junkieпропущено...


Что значит придумывать правила? Допустим вам надо логировать ситуации, когда количество остатка стало меньше 0. Вроде элементарная задача, как ее при помощи INSTEAD OF триггера реализовать?
а делать это на этапе добавления записи, которая может привести к остатку < 0, не?
или подразумевается, что кто-то может править содержимое вьюхи в плане изменения остатка? типа чёта мало тут, давай сотку накинем... тогда ребята правильно путём идут бизнес делать.

Какой записи? Допустим у вас остаток расчитывается, как-то хитро.

Кто-то делает какое-то изменение UPDATE shipmentDetail SET product=54 WHERE id=123

Это для старого товара уменьшит остаток, для нового увеличит. То есть остаток может стать меньше 0, это хочется залогировать (для склада товара), вместе скажем с человеком и изменением которые привели к этому.

Если бы можно было сделать триггер на представление balance все делалось бы одной строчкой. А так вариантов которые приведут к тому что останет меньше 0 сотни. Куда что вставлять?
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848339
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
остаток не должен расчитываться, он должен записываться
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848383
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieЕсли бы можно было сделать триггер на представление balance все делалось бы одной строчкой.Ну так делайте. Или что-то мешает?
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848416
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkie,

Код: sql
1.
SELECT COUNT(*) FROM ShipmentDetail s1, ShipmentDetail s2 WHERE s1.sd=s2.sd AND s1.id <> s2.id



Вы чего-то не договариваете. У меня план запроса на таблице с индексом по nullable колонке очень простой - constant scan. Скорее всего,выбран тривиальный план.

Версия сервера какая, интересно?
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848456
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneостаток не должен расчитываться, он должен записываться

Ну для начала определяется как должен рассчитываться, а как записываться это уже следствие.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848457
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmNitro_JunkieЕсли бы можно было сделать триггер на представление balance все делалось бы одной строчкой.Ну так делайте. Или что-то мешает?
MS SQL не дает триггеры на представления делать.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848459
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieKonst_Oneостаток не должен расчитываться, он должен записываться

Ну для начала определяется как должен рассчитываться, а как записываться это уже следствие.


не надо для этого делать представления, программа должна уже расчитанный остаток зхаписывать в отдельную таблицу
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848460
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkieinvmпропущено...
Ну так делайте. Или что-то мешает?
MS SQL не дает триггеры на представления делать.
А пацаны то не знали...

https://docs.microsoft.com/ru-ru/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017
CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name
ON { table | view }
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848461
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовNitro_Junkie,

Код: sql
1.
SELECT COUNT(*) FROM ShipmentDetail s1, ShipmentDetail s2 WHERE s1.sd=s2.sd AND s1.id <> s2.id



Вы чего-то не договариваете. У меня план запроса на таблице с индексом по nullable колонке очень простой - constant scan. Скорее всего,выбран тривиальный план.

Версия сервера какая, интересно?

Да в том то и проблема, что выбирается тривиальный план.

SQL Server (15.0.1700.37) это 2019 preview как я понимаю. Но на эту проблему мне на всех серверах жаловались.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848480
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieMS SQL не дает триггеры на представления делать.Вы просто не в курсе, что для представлений допустимы instead of триггеры.
Nitro_JunkieДа в том то и проблема, что выбирается тривиальный план.Проблема в том, что такой оптимизации в MSSQL нету. Тривиальность плана ни при чем.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848502
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nitro_Junkieandy stпропущено...

а делать это на этапе добавления записи, которая может привести к остатку < 0, не?
или подразумевается, что кто-то может править содержимое вьюхи в плане изменения остатка? типа чёта мало тут, давай сотку накинем... тогда ребята правильно путём идут бизнес делать.

Какой записи? Допустим у вас остаток расчитывается, как-то хитро.

Кто-то делает какое-то изменение UPDATE shipmentDetail SET product=54 WHERE id=123

Это для старого товара уменьшит остаток, для нового увеличит. То есть остаток может стать меньше 0, это хочется залогировать (для склада товара), вместе скажем с человеком и изменением которые привели к этому.

Если бы можно было сделать триггер на представление balance все делалось бы одной строчкой. А так вариантов которые приведут к тому что останет меньше 0 сотни. Куда что вставлять?
т.е. вариант, когда это будет делать триггер на shipmentDetail даже не рассматривается?
и разве в balance есть пользователь и вообще какие-то данные, которые могли бы идентифицировать измененную запись? там обезличенные аггрегаты.
Или подразумевается, что триггер в одну строку на view сможет из изменению 1 значения идентифицировать строку, которая привела к этому? Ну напишите, что ли, новый стандарт ХЗQL по этому поводу, опишите поведение. В MSSQL 2025 это будет реализовано, как пить дать
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848529
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_OneNitro_Junkieпропущено...


Ну для начала определяется как должен рассчитываться, а как записываться это уже следствие.


не надо для этого делать представления, программа должна уже расчитанный остаток зхаписывать в отдельную таблицу

Представление определяет что мы хотим получить. Как это представление должно обновляться уже задача SQL сервера. То что они этого не умеют делать, ну значит руки не из того места растут. В том же lsFusion так можно делать.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848531
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinamotoА пацаны то не знали...

invmВы просто не в курсе, что для представлений допустимы instead of триггеры.
Издеваетесь? Я же сверху писал, что триггер INSTEADOF на balance вам никак не поможет, в задаче выполнения действий, когда остаток станет меньше 0.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848534
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy stNitro_Junkieпропущено...


Какой записи? Допустим у вас остаток расчитывается, как-то хитро.

Кто-то делает какое-то изменение UPDATE shipmentDetail SET product=54 WHERE id=123

Это для старого товара уменьшит остаток, для нового увеличит. То есть остаток может стать меньше 0, это хочется залогировать (для склада товара), вместе скажем с человеком и изменением которые привели к этому.

Если бы можно было сделать триггер на представление balance все делалось бы одной строчкой. А так вариантов которые приведут к тому что останет меньше 0 сотни. Куда что вставлять?
т.е. вариант, когда это будет делать триггер на shipmentDetail даже не рассматривается?
и разве в balance есть пользователь и вообще какие-то данные, которые могли бы идентифицировать измененную запись? там обезличенные аггрегаты.
Или подразумевается, что триггер в одну строку на view сможет из изменению 1 значения идентифицировать строку, которая привела к этому? Ну напишите, что ли, новый стандарт ХЗQL по этому поводу, опишите поведение. В MSSQL 2025 это будет реализовано, как пить дать

Вы себе представляете, сколько и каких триггеров там должно быть, если balance хоть сколько нибудь сложный. Ну например с внутренними перемещениями.

Ну в задаче было не про строку, а хотя бы пользователя.

А вообще мы это все реализовали в lsFusion.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848568
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всегда удивляют изобретатели SQL

Вам там на хабре уже наобъясняли подробно, что вы занимаетесь очередным нишевым продуктом, но по какой то причине, называете это убийцей SQL

Эти скучные базы данных делают простые три вещи: читают данные с диска, читают данные из памяти и обрабатывают их с помощью процессора. Это физика, тут все давно оптимизировано по самое небалуйся и придумать ничего нельзя никак совсем. Не получите вы данные с диска не прочитав их сначала... Дальше вопрос реализации хранения, чтения и обработки. У вас есть свои (лучшие) алгоритмы на физические операторы?

Зато у вас в языке абстракция на абстракции, материализации и индексы, которые по волшебству хранят сразу все в святом духе и не требуют сканов, сиков и никаких ограничений конечно. Прям отмена закона сохранения энергии: и данные получаем посчитанные и память не тратим и производительность не страдает. Действительно, зачем тогда архитектура, триггеры и логика, когда все святым духом сразу выбирается и считается само. И все за счет синтаксиса, между прочим!

Не, конечно долго можно расписывать как одна абстракция реализована лучше/хуже другой в том или ином продукте, но не бывает волшебной таблетки, когда вопрос в железе, в физике. А писать можно хоть на ассемблере.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848581
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nitro_Junkieandy stт.е. вариант, когда это будет делать триггер на shipmentDetail даже не рассматривается?
и разве в balance есть пользователь и вообще какие-то данные, которые могли бы идентифицировать измененную запись? там обезличенные аггрегаты.
Или подразумевается, что триггер в одну строку на view сможет из изменению 1 значения идентифицировать строку, которая привела к этому? Ну напишите, что ли, новый стандарт ХЗQL по этому поводу, опишите поведение. В MSSQL 2025 это будет реализовано, как пить дать
Вы себе представляете, сколько и каких триггеров там должно быть, если balance хоть сколько нибудь сложный. Ну например с внутренними перемещениями.
Ну в задаче было не про строку, а хотя бы пользователя.
А вообще мы это все реализовали в lsFusion.
Т.е. в lsFusion в balance по обезличенной агрегированной строке, число в которой считаются по алгоритму "balance хоть сколько нибудь сложный" из зависит от 100500 пользователей триггером можно определить конкретного пользователя? ну всё! круто! sql-базы в очередной раз будут похоронены и сотни тысяч sql-программистов будут выкинуты на улицу.
p.s. уже лет так 25, как продолжаются похороны реляционных БД и того же Delphi. В процессе похорон было закидано еловыми ветками несколько трупов хоронящих. Но появляются новые члены процессии и процесс продолжается.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848625
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PizzaPizzaВсегда удивляют изобретатели SQL

Вам там на хабре уже наобъясняли подробно, что вы занимаетесь очередным нишевым продуктом, но по какой то причине, называете это убийцей SQL


Область применения lsFusion вполне конкретная - разработка информационным систем. То есть почти полностью совпадает с SQL. Так что в этом смысле и SQL - очередной нишевой продукт.

И на хабре людей и мнений огромное число. SQL девелоперы считают одно. 1с - другое. .Net-третье, Web - четвертое. Web разработчики нас вообще тянут революцию в веб делать прикручивая React.

PizzaPizzaЭти скучные базы данных делают простые три вещи: читают данные с диска, читают данные из памяти и обрабатывают их с помощью процессора. Это физика, тут все давно оптимизировано по самое небалуйся и придумать ничего нельзя никак совсем. Не получите вы данные с диска не прочитав их сначала... Дальше вопрос реализации хранения, чтения и обработки. У вас есть свои (лучшие) алгоритмы на физические операторы?


Физически компьютеры просто читают данные из памяти, записывают их в регистры процессора, а потом выполняют команды процессора. А эти гуглы и jetbrains'ы со своими go и kotlin возятся. У них есть свои физические операторы работы с процессором?

PizzaPizzaЗато у вас в языке абстракция на абстракции, материализации и индексы, которые по волшебству хранят сразу все в святом духе и не требуют сканов, сиков и никаких ограничений конечно. Прям отмена закона сохранения энергии: и данные получаем посчитанные и память не тратим и производительность не страдает. Действительно, зачем тогда архитектура, триггеры и логика, когда все святым духом сразу выбирается и считается само. И все за счет синтаксиса, между прочим!

Требуют и сканы и сики , но кроме этого есть еще оптимизаторы в общем случае, прозрачные материализации, события и ограничения на вычисляемые данные и кучу чего еще что не умеют SQL сервера. И не по волшебству, а в результате огромного количества человека часов. И синтаксис тут совсем не причем. Синтаксис в данном случае это 1%, его можно изменить как угодно, функционал не изменится.

PizzaPizzaА писать можно хоть на ассемблере.
Но почему-то не пишут. А знаете почему? Потому что время разработчика в современном мире очень дорогое.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848626
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy stNitro_Junkieпропущено...

Вы себе представляете, сколько и каких триггеров там должно быть, если balance хоть сколько нибудь сложный. Ну например с внутренними перемещениями.
Ну в задаче было не про строку, а хотя бы пользователя.
А вообще мы это все реализовали в lsFusion.
Т.е. в lsFusion в balance по обезличенной агрегированной строке, число в которой считаются по алгоритму "balance хоть сколько нибудь сложный" из зависит от 100500 пользователей триггером можно определить конкретного пользователя? ну всё! круто! sql-базы в очередной раз будут похоронены и сотни тысяч sql-программистов будут выкинуты на улицу.
p.s. уже лет так 25, как продолжаются похороны реляционных БД и того же Delphi. В процессе похорон было закидано еловыми ветками несколько трупов хоронящих. Но появляются новые члены процессии и процесс продолжается.

В lsFusion можно любой показатель указать MATERIALIZED и он будет храниться в таблице и автоматически эффективно транзакционно обновляться на любом объеме данных. Назовете еще один труп, который хотя бы это умеет делать. Ну или треть из этого .
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848647
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieMinamotoА пацаны то не знали...

invmВы просто не в курсе, что для представлений допустимы instead of триггеры.
Издеваетесь? Я же сверху писал, что триггер INSTEADOF на balance вам никак не поможет, в задаче выполнения действий, когда остаток станет меньше 0.
Нет. Вы писали:
Nitro_JunkieMS SQL не дает триггеры на представления делать.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848664
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nitro_Junkieandy stпропущено...
Т.е. в lsFusion в balance по обезличенной агрегированной строке, число в которой считаются по алгоритму "balance хоть сколько нибудь сложный" из зависит от 100500 пользователей триггером можно определить конкретного пользователя? ну всё! круто! sql-базы в очередной раз будут похоронены и сотни тысяч sql-программистов будут выкинуты на улицу.
p.s. уже лет так 25, как продолжаются похороны реляционных БД и того же Delphi. В процессе похорон было закидано еловыми ветками несколько трупов хоронящих. Но появляются новые члены процессии и процесс продолжается.

В lsFusion можно любой показатель указать MATERIALIZED и он будет храниться в таблице и автоматически эффективно транзакционно обновляться на любом объеме данных. Назовете еще один труп, который хотя бы это умеет делать. Ну или треть из этого .
а пользователя то в разрисованной выше задаче определит или как?
select COUNT_BIG(*) from [values]
--------------------
43939522237

(затронута одна строка)
добавка данные ~100к строк в минуту
этот показатель можно тож заматериализовать?
и будет работать?
пошел качать...

Ну и что-то с таким функционалом должно когда-нибудь стать первым :)
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848667
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nitro_Junkie,
еще на заметку, в SQL Server есть такая фишка
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848688
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nitro_Junkie...Web разработчики нас вообще тянут революцию в веб делать прикручивая React...
из фраз заказчика:
автор.. а Вы не могли бы сделать рабочее место в виде обычной программы, а не через интернет. У нас на рабочих планшетах хром сильно тормозит...
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848699
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinamotoNitro_Junkieпропущено...

пропущено...

Издеваетесь? Я же сверху писал, что триггер INSTEADOF на balance вам никак не поможет, в задаче выполнения действий, когда остаток станет меньше 0.
Нет. Вы писали:
Nitro_JunkieMS SQL не дает триггеры на представления делать.

INSTEAD OF это по сути не триггеры. Они просто называются тем же словом.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848704
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy stNitro_Junkieпропущено...


В lsFusion можно любой показатель указать MATERIALIZED и он будет храниться в таблице и автоматически эффективно транзакционно обновляться на любом объеме данных. Назовете еще один труп, который хотя бы это умеет делать. Ну или треть из этого .
а пользователя то в разрисованной выше задаче определит или как?
select COUNT_BIG(*) from [values]
--------------------
43939522237

(затронута одна строка)
добавка данные ~100к строк в минуту
этот показатель можно тож заматериализовать?
и будет работать?
пошел качать...

Ну и что-то с таким функционалом должно когда-нибудь стать первым :)

У вас UPDATE CONFLICT'ов будет много. Но как-то работать будет. Так что лучше x= SELECT COUNT_BIG(*) from [values] GROUP BY [выражение, где разновидностей хотя бы 1000]. А потом представление SELECT SUM() from x оставьте нематериализованным и используйте его.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848705
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy stNitro_Junkie,
еще на заметку, в SQL Server есть такая фишка

И к чему эта фишка. Особенно, когда неизвестно разреженная колонка будет или нет. Точнее она может быть разреженной, а потом быстро стать не разреженной. Очень удобный функционал.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848717
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nitro_Junkieandy stNitro_Junkie,
еще на заметку, в SQL Server есть такая фишка
И к чему эта фишка. Особенно, когда неизвестно разреженная колонка будет или нет. Точнее она может быть разреженной, а потом быстро стать не разреженной. Очень удобный функционал.
Ну тогда и типы данных в колонках в общем случае тоже неизвестны. И количество колонок. И наличие памяти/диска/сервера для хранения таблицы в общем виде тоже неизвестно.... может быть единственный процессор, а потом не быть. есть программная эмуляция?

p.s. про того ^^ пользователя из balance уже и не спрашиваю...
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848724
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy stNitro_Junkieпропущено...

И к чему эта фишка. Особенно, когда неизвестно разреженная колонка будет или нет. Точнее она может быть разреженной, а потом быстро стать не разреженной. Очень удобный функционал.
Ну тогда и типы данных в колонках в общем случае тоже неизвестны. И количество колонок. И наличие памяти/диска/сервера для хранения таблицы в общем виде тоже неизвестно.... может быть единственный процессор, а потом не быть. есть программная эмуляция?

p.s. про того ^^ пользователя из balance уже и не спрашиваю...

Поэтому в идеале как можно больше должен делать сам сервер. В том числе в идеале добавлять материализации и определять расположение в таблицах. Хотя до этого даже мы не дошли пока. Но хотя бы сделали эти механизмы прозрачными.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848938
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что, когда ждать смерти SQL? Есть примерные сроки?
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39848941
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MegabyteНу что, когда ждать смерти SQL? Есть примерные сроки?

На следующей неделе я думаю :)

Хотя смерть в данном контексте неправильное слово. Мы же не говорим о смерте машинных кодов. Просто есть абстракции компилируемые в этот машинный код. А сами машинные коды - живее всех живых.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849007
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy stNitro_Junkie,
в статье ребята не смогли в SQL, поэтому придумали какую-то свою приблуду и попытались написать, почему в SQL всё плохо.
Те же cross apply и instead of триггеры для вьюшек как-то упустили.
Может не знали - подтверждение что "не смогли в SQL". Если знали и не описали, ибо в статью слегка ломало - то что-то другое :)Причем приблуда все равно использует существующие БД которуые так опускают в статье.
А вообще если бы статья не была бы чистой воды рекламой я бы сказал что её писали идиоты. А так, в принципе понятно зачем и почему так написано.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849008
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy stNitro_Junkie,
в статье ребята не смогли в SQL, поэтому придумали какую-то свою приблуду и попытались написать, почему в SQL всё плохо.
Те же cross apply и instead of триггеры для вьюшек как-то упустили.
Может не знали - подтверждение что "не смогли в SQL". Если знали и не описали, ибо в статью слегка ломало - то что-то другое :)Причем приблуда все равно использует существующие БД которуые так опускают в статье.
А вообще если бы статья не была бы чистой воды рекламой я бы сказал что её писали идиоты. А так, в принципе понятно зачем и почему так написано.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849015
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mindandy stNitro_Junkie,
в статье ребята не смогли в SQL, поэтому придумали какую-то свою приблуду и попытались написать, почему в SQL всё плохо.
Те же cross apply и instead of триггеры для вьюшек как-то упустили.
Может не знали - подтверждение что "не смогли в SQL". Если знали и не описали, ибо в статью слегка ломало - то что-то другое :)Причем приблуда все равно использует существующие БД которуые так опускают в статье.
А вообще если бы статья не была бы чистой воды рекламой я бы сказал что её писали идиоты. А так, в принципе понятно зачем и почему так написано.

Ну строго говоря притягивать instead of триггеры сюда, это либо идиотизм, либо просто не понимание того пункта статьи. Я тут уже раз 5 все объяснил.

По факту было 2 косяка, это transition tables в PostgreSQL (да их действительно упустили) и CROSS APPLY, но второй это полукосяк: с View он помогает лишь частично, потому как непонятно что с LEFT JOIN (OUTER APPLY) делать (так как ON'а нет, а впихнуть условие соединения в WHERE как с CROSS APPLY не получится).

Ну и смысл статьи был не в том что отказаться от SQL, а доделать его и доделать нормально, а не как сейчас.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849124
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkieпотому как непонятно что с LEFT JOIN (OUTER APPLY) делать (так как ON'а нет, а впихнуть условие соединения в WHERE как с CROSS APPLY не получится)Мда, прежде чем писать подобные статьи, надо, все-таки, владеть предметом...
Код: sql
1.
2.
3.
4.
5.
SELECT shipmentDetail.id, b.quantity
	FROM shipmentDetail 
	JOIN shipment ON shipmentDetail.shipment = shipment.id
	outer apply (select quantity from balance(shipment.date) where stock = shipment.stock AND product = shipmentDetail.product) b
	WHERE shipmentDetail.quantity = 5
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849144
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmNitro_Junkieпотому как непонятно что с LEFT JOIN (OUTER APPLY) делать (так как ON'а нет, а впихнуть условие соединения в WHERE как с CROSS APPLY не получится)Мда, прежде чем писать подобные статьи, надо, все-таки, владеть предметом...
Код: sql
1.
2.
3.
4.
5.
SELECT shipmentDetail.id, b.quantity
	FROM shipmentDetail 
	JOIN shipment ON shipmentDetail.shipment = shipment.id
	outer apply (select quantity from balance(shipment.date) where stock = shipment.stock AND product = shipmentDetail.product) b
	WHERE shipmentDetail.quantity = 5



Хм.. Громоздко конечно, но прокатит, сейчас дополню статью.

В любом случае этот запрос у вас не выполнится, потому как план с nested loop будет, я дополнил это уже в статье.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849146
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkie,

авторВ любом случае этот запрос у вас не выполнится, потому как план с nested loop будет, я дополнил это уже в статье.
это потому что планы с NL никогда не выполняются?
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849158
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKNitro_Junkie,

авторВ любом случае этот запрос у вас не выполнится, потому как план с nested loop будет, я дополнил это уже в статье.
это потому что планы с NL никогда не выполняются?
Если там 10к записей то нет. Я не дождался во всяком случае выполнения вот такого запроса:
Код: sql
1.
2.
3.
4.
5.
SELECT shipmentDetail.id, b.quantity
	FROM shipmentDetail 
	JOIN shipment ON shipmentDetail.shipment = shipment.id
	outer apply (select quantity from balance(shipment.date) where stock = shipment.stock AND product = shipmentDetail.product) b
	WHERE shipmentDetail.id%1000 = 0
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849164
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shipmentDetail.id%1000

извращение ещё то, вы как будто специально ставите сервер в позу своими запросами
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849165
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_OneshipmentDetail.id%1000

извращение ещё то, вы как будто специально ставите сервер в позу своими запросами

Тут любое условие где >10к записей подойдет.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849170
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkie,

и на какую оптимизация Вы рассчитываете в этом условии?

Код: sql
1.
WHERE shipmentDetail.id%1000 = 0
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849174
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkieпотому как план с nested loop будетСерьезно?
Код: 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.
use tempdb;
go

create table dbo.t1 (id int primary key, dt datetime, a int);
create table dbo.t2 (id int primary key, t1_id int, dt datetime, b int);

update statistics dbo.t1 with rowcount = 100000;
update statistics dbo.t2 with rowcount = 10000000;
go

create function dbo.fn1
(
 @dt datetime
)
returns table
as
return
 select
  id, dt, t1_id, b
 from
  dbo.t2
 where
  dt = @dt;
go

set statistics profile on;

select
 a.id, a.a, b.b
from
 dbo.t1 a outer apply
 (select b from dbo.fn1(a.dt) where t1_id = a.id) b;

set statistics profile off;
go

drop function dbo.fn1;
drop table dbo.t1, dbo.t2;
go


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select   a.id, a.a, b.b  from   dbo.t1 a outer apply   (select b from dbo.fn1(a.dt) where t1_id = a.id) b
  |--Parallelism(Gather Streams)
       |--Hash Match(Left Outer Join, HASH:([a].[dt], [a].[id])=([tempdb].[dbo].[t2].[dt], [tempdb].[dbo].[t2].[t1_id]), RESIDUAL:([tempdb].[dbo].[t2].[dt]=[tempdb].[dbo].[t1].[dt] as [a].[dt] AND [tempdb].[dbo].[t2].[t1_id]=[tempdb].[dbo].[t1].[id] as [a].[id]))
            |--Bitmap(HASH:([a].[dt], [a].[id]), DEFINE:([Bitmap1004]))
            |    |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([a].[dt], [a].[id]))
            |         |--Clustered Index Scan(OBJECT:([tempdb].[dbo].[t1].[PK__t1__3213E83F86CDC1E6] AS [a]))
            |--Compute Scalar(DEFINE:([Expr1003]=[tempdb].[dbo].[t2].[b]))
                 |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([tempdb].[dbo].[t2].[dt], [tempdb].[dbo].[t2].[t1_id]))
                      |--Clustered Index Scan(OBJECT:([tempdb].[dbo].[t2].[PK__t2__3213E83F436C000F]), WHERE:(PROBE([Bitmap1004],[tempdb].[dbo].[t2].[dt],[tempdb].[dbo].[t2].[t1_id])))


ЗЫ: Гарантированный NL будет, если в в apply или в функции будет select top(...) ...
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849175
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовNitro_Junkie,

и на какую оптимизация Вы рассчитываете в этом условии?

Код: sql
1.
WHERE shipmentDetail.id%1000 = 0



На то что hash join будет. Как если грубо говоря сделать:

Код: sql
1.
2.
3.
4.
5.
SELECT shipmentDetail.id, b.quantity
	FROM shipmentDetail 
	JOIN shipment ON shipmentDetail.shipment = shipment.id
	LEFT JOIN balance(shipment.date) ON stock = shipment.stock AND product = shipmentDetail.product b
	WHERE shipmentDetail.id%1000 = 0



А если быть точным, вот так, как делает lsFusion:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT shipmentDetail.id, b.quantity
	FROM shipmentDetail 
	JOIN shipment ON shipmentDetail.shipment = shipment.id
	JOIN (SELECT stock, product, dates.date, SUM(quantity) AS quantity
		FROM
			(SELECT receipt.stock, product, receipt.date, quantity
			FROM receiptDetail 
				JOIN receipt ON receiptDetail.receipt = receipt.id
			UNION ALL 
			SELECT shipment.stock, product, shipment.date, -quantity
				FROM shipmentDetail 
				JOIN shipment ON shipmentDetail.shipment = shipment.id
			) details
		JOIN 
			(SELECT shipment.date
				FROM shipmentDetail 
				JOIN shipment ON shipmentDetail.shipment = shipment.id
				WHERE shipmentDetail.id %1000 = 0
				GROUP BY shipment.date
			) dates ON details.date < dates.date
		GROUP BY stock, product, dates.date
	) b ON b.stock = shipment.stock AND b.product = shipmentDetail.product AND b.date = shipment.date
	WHERE shipmentDetail.id %1000 = 0



Это все есть в статье, к которой тут все норовят придраться.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849179
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmNitro_Junkieпотому как план с nested loop будетСерьезно?
Код: 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.
use tempdb;
go

create table dbo.t1 (id int primary key, dt datetime, a int);
create table dbo.t2 (id int primary key, t1_id int, dt datetime, b int);

update statistics dbo.t1 with rowcount = 100000;
update statistics dbo.t2 with rowcount = 10000000;
go

create function dbo.fn1
(
 @dt datetime
)
returns table
as
return
 select
  id, dt, t1_id, b
 from
  dbo.t2
 where
  dt = @dt;
go

set statistics profile on;

select
 a.id, a.a, b.b
from
 dbo.t1 a outer apply
 (select b from dbo.fn1(a.dt) where t1_id = a.id) b;

set statistics profile off;
go

drop function dbo.fn1;
drop table dbo.t1, dbo.t2;
go


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select   a.id, a.a, b.b  from   dbo.t1 a outer apply   (select b from dbo.fn1(a.dt) where t1_id = a.id) b
  |--Parallelism(Gather Streams)
       |--Hash Match(Left Outer Join, HASH:([a].[dt], [a].[id])=([tempdb].[dbo].[t2].[dt], [tempdb].[dbo].[t2].[t1_id]), RESIDUAL:([tempdb].[dbo].[t2].[dt]=[tempdb].[dbo].[t1].[dt] as [a].[dt] AND [tempdb].[dbo].[t2].[t1_id]=[tempdb].[dbo].[t1].[id] as [a].[id]))
            |--Bitmap(HASH:([a].[dt], [a].[id]), DEFINE:([Bitmap1004]))
            |    |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([a].[dt], [a].[id]))
            |         |--Clustered Index Scan(OBJECT:([tempdb].[dbo].[t1].[PK__t1__3213E83F86CDC1E6] AS [a]))
            |--Compute Scalar(DEFINE:([Expr1003]=[tempdb].[dbo].[t2].[b]))
                 |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([tempdb].[dbo].[t2].[dt], [tempdb].[dbo].[t2].[t1_id]))
                      |--Clustered Index Scan(OBJECT:([tempdb].[dbo].[t2].[PK__t2__3213E83F436C000F]), WHERE:(PROBE([Bitmap1004],[tempdb].[dbo].[t2].[dt],[tempdb].[dbo].[t2].[t1_id])))


ЗЫ: Гарантированный NL будет, если в в apply или в функции будет select top(...) ...

Гарантированный NL в данном случае будет (а не вообще). Когда у вас есть параметр, для которого таблицы и предиката = нет (есть только на >, < типа остатка / задолженности на дату как в примере).
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849189
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkie,

авторкак делает lsFusion

Хм, это очень плохой запрос, поднять его производительность можно только методом грубой силы (оборудованием). В нем есть и сортировки, и просмотры, предполагаю, что и параллельный план выполнения не может быть для него построен.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849192
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieГарантированный NL в данном случае будет (а не вообще). Когда у вас есть параметр, для которого таблицы и предиката = нетКогда нет предиката эквивалентности как раз и будет гарантиролванный NL, что для join, что для apply.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849205
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовNitro_Junkie,

авторкак делает lsFusion

Хм, это очень плохой запрос, поднять его производительность можно только методом грубой силы (оборудованием). В нем есть и сортировки, и просмотры, предполагаю, что и параллельный план выполнения не может быть для него построен.

Ну он точно лучше чем базовый (который вешает все намертво). И хорошо параллелится (с чего вдруг он не должен этого делать).
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849208
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmNitro_JunkieГарантированный NL в данном случае будет (а не вообще). Когда у вас есть параметр, для которого таблицы и предиката = нетКогда нет предиката эквивалентности как раз и будет гарантиролванный NL, что для join, что для apply.

Когда есть предикат эквивалентности то и UDF и APPLY не нужны. Можно построить обычный VIEW, просто с join'ить его а Join Predicate Push Down все сам сделает. А смысл пункта в статье именно в таких параметрах.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849236
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieКогда есть предикат эквивалентности то и UDF и APPLY не нужны.А когда нету, то нужны?

Вы просто не знаете как решать подобные задачи.
Код: 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.
CREATE FUNCTION balance (
    @date DATE,
    @stock ... = null,
    @product ... = null
)
RETURNS TABLE
AS
RETURN
SELECT stock, product, SUM(quantity) AS quantity
	FROM
		(SELECT receipt.stock, product, quantity
		FROM receiptDetail 
			JOIN receipt ON receiptDetail.receipt = receipt.id
			WHERE @stock is null and @product is null and receipt.date < @date
		UNION ALL 
		SELECT receipt.stock, product, quantity
		FROM receiptDetail 
			JOIN receipt ON receiptDetail.receipt = receipt.id
			WHERE @stock is not null and @product is not null and receipt.date < @date and stock = @stock and product = @product
		UNION ALL 
        SELECT shipment.stock, product, -quantity
			FROM shipmentDetail 
			JOIN shipment ON shipmentDetail.shipment = shipment.id
			WHERE @stock is null and @product is null and shipment.date < @date
		UNION ALL 
        SELECT shipment.stock, product, -quantity
			FROM shipmentDetail 
			JOIN shipment ON shipmentDetail.shipment = shipment.id
			WHERE @stock is not null and @product is not null and shipment.date < @date) details and stock = @stock and product = @product
	GROUP BY stock, product


Код: sql
1.
2.
3.
4.
5.
SELECT shipmentDetail.id, b.quantity
	FROM shipmentDetail 
	JOIN shipment ON shipmentDetail.shipment = shipment.id
	outer apply balance(shipment.date, shipment.stock, shipmentDetail.product) b
	WHERE shipmentDetail.id%1000 = 0
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849262
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmNitro_JunkieКогда есть предикат эквивалентности то и UDF и APPLY не нужны.А когда нету, то нужны?

Вы просто не знаете как решать подобные задачи.
Код: 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.
CREATE FUNCTION balance (
    @date DATE,
    @stock ... = null,
    @product ... = null
)
RETURNS TABLE
AS
RETURN
SELECT stock, product, SUM(quantity) AS quantity
	FROM
		(SELECT receipt.stock, product, quantity
		FROM receiptDetail 
			JOIN receipt ON receiptDetail.receipt = receipt.id
			WHERE @stock is null and @product is null and receipt.date < @date
		UNION ALL 
		SELECT receipt.stock, product, quantity
		FROM receiptDetail 
			JOIN receipt ON receiptDetail.receipt = receipt.id
			WHERE @stock is not null and @product is not null and receipt.date < @date and stock = @stock and product = @product
		UNION ALL 
        SELECT shipment.stock, product, -quantity
			FROM shipmentDetail 
			JOIN shipment ON shipmentDetail.shipment = shipment.id
			WHERE @stock is null and @product is null and shipment.date < @date
		UNION ALL 
        SELECT shipment.stock, product, -quantity
			FROM shipmentDetail 
			JOIN shipment ON shipmentDetail.shipment = shipment.id
			WHERE @stock is not null and @product is not null and shipment.date < @date) details and stock = @stock and product = @product
	GROUP BY stock, product


Код: sql
1.
2.
3.
4.
5.
SELECT shipmentDetail.id, b.quantity
	FROM shipmentDetail 
	JOIN shipment ON shipmentDetail.shipment = shipment.id
	outer apply balance(shipment.date, shipment.stock, shipmentDetail.product) b
	WHERE shipmentDetail.id%1000 = 0



Это вы к чему? Я имел ввиду что если бы запрос был на равенство date, то ни UDF ни APPLY не нужны были бы, можно было бы VIEW и JOIN обойтись.

Ну и в том что вы кинули тот же дурацкий план с nested loops:

Код: 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.
SELECT shipmentDetail.id, b.quantity   FROM shipmentDetail    JOIN shipment ON shipmentDetail.shipment = shipment.id   outer apply pbalance(shipment.date, shipment.stock, shipmentDetail.product) b   WHERE shipmentDetail.id%1000 = 0 OPTION (MAXDOP 1)
  |--Nested Loops(Left Outer Join, OUTER REFERENCES:([test].[dbo].[shipmentdetail].[product], [test].[dbo].[shipment].[date], [test].[dbo].[shipment].[stock]))
       |--Hash Match(Inner Join, HASH:([test].[dbo].[shipmentdetail].[shipment])=([test].[dbo].[shipment].[id]))
       |    |--Index Scan(OBJECT:([test].[dbo].[shipmentdetail].[shipmentdetail_p_s]),  WHERE:([test].[dbo].[shipmentdetail].[id]%(1000)=(0)))
       |    |--Clustered Index Scan(OBJECT:([test].[dbo].[shipment].[PK__shipment__3213E83F4B7B4D07]))
       |--Compute Scalar(DEFINE:([Expr1025]=CASE WHEN [Expr1033]=(0) THEN NULL ELSE [Expr1034] END))
            |--Stream Aggregate(DEFINE:([Expr1033]=COUNT_BIG([Union1024]), [Expr1034]=SUM([Union1024])))
                 |--Concatenation
                      |--Nested Loops(Inner Join, OUTER REFERENCES:([test].[dbo].[receiptdetail].[receipt]))
                      |    |--Nested Loops(Inner Join, OUTER REFERENCES:([test].[dbo].[receiptdetail].[id]))
                      |    |    |--Filter(WHERE:(STARTUP EXPR([test].[dbo].[shipment].[stock] IS NULL AND [test].[dbo].[shipmentdetail].[product] IS NULL)))
                      |    |    |    |--Index Seek(OBJECT:([test].[dbo].[receiptdetail].[receiptdetail_product_fk]), SEEK:([test].[dbo].[receiptdetail].[product]=[test].[dbo].[shipmentdetail].[product]) ORDERED FORWARD)
                      |    |    |--Clustered Index Seek(OBJECT:([test].[dbo].[receiptdetail].[PK__receiptd__3213E83FE8063B8C]), SEEK:([test].[dbo].[receiptdetail].[id]=[test].[dbo].[receiptdetail].[id]) LOOKUP ORDERED FORWARD)
                      |    |--Clustered Index Seek(OBJECT:([test].[dbo].[receipt].[PK__receipt__3213E83FE2F580DF]), SEEK:([test].[dbo].[receipt].[id]=[test].[dbo].[receiptdetail].[receipt]),  WHERE:([test].[dbo].[receipt].[stock]=[test].[dbo].[shipment].[stock] AND [test].[dbo].[receipt].[date]<[test].[dbo].[shipment].[date]) ORDERED FORWARD)
                      |--Nested Loops(Inner Join, OUTER REFERENCES:([test].[dbo].[receiptdetail].[receipt]))
                      |    |--Filter(WHERE:(STARTUP EXPR([test].[dbo].[shipment].[stock] IS NOT NULL AND [test].[dbo].[shipmentdetail].[product] IS NOT NULL)))
                      |    |    |--Index Spool(SEEK:([test].[dbo].[receiptdetail].[product]=[test].[dbo].[shipmentdetail].[product]))
                      |    |         |--Clustered Index Scan(OBJECT:([test].[dbo].[receiptdetail].[PK__receiptd__3213E83FE8063B8C]))
                      |    |--Clustered Index Seek(OBJECT:([test].[dbo].[receipt].[PK__receipt__3213E83FE2F580DF]), SEEK:([test].[dbo].[receipt].[id]=[test].[dbo].[receiptdetail].[receipt]),  WHERE:([test].[dbo].[receipt].[stock]=[test].[dbo].[shipment].[stock] AND [test].[dbo].[receipt].[date]<[test].[dbo].[shipment].[date]) ORDERED FORWARD)
                      |--Nested Loops(Inner Join, OUTER REFERENCES:([test].[dbo].[shipmentdetail].[shipment], [Expr1031]) WITH UNORDERED PREFETCH)
                      |    |--Filter(WHERE:(STARTUP EXPR([test].[dbo].[shipment].[stock] IS NULL AND [test].[dbo].[shipmentdetail].[product] IS NULL)))
                      |    |    |--Index Spool(SEEK:([test].[dbo].[shipmentdetail].[product]=[test].[dbo].[shipmentdetail].[product]))
                      |    |         |--Compute Scalar(DEFINE:([Expr1016]= -[test].[dbo].[shipmentdetail].[quantity]))
                      |    |              |--Clustered Index Scan(OBJECT:([test].[dbo].[shipmentdetail].[PK__shipment__3213E83F996CFFF4]))
                      |    |--Clustered Index Seek(OBJECT:([test].[dbo].[shipment].[PK__shipment__3213E83F4B7B4D07]), SEEK:([test].[dbo].[shipment].[id]=[test].[dbo].[shipmentdetail].[shipment]),  WHERE:([test].[dbo].[shipment].[stock]=[test].[dbo].[shipment].[stock] AND [test].[dbo].[shipment].[date]<[test].[dbo].[shipment].[date]) ORDERED FORWARD)
                      |--Nested Loops(Inner Join, OUTER REFERENCES:([test].[dbo].[shipmentdetail].[shipment], [Expr1032]) WITH UNORDERED PREFETCH)
                           |--Filter(WHERE:(STARTUP EXPR([test].[dbo].[shipment].[stock] IS NOT NULL AND [test].[dbo].[shipmentdetail].[product] IS NOT NULL)))
                           |    |--Index Spool(SEEK:([test].[dbo].[shipmentdetail].[product]=[test].[dbo].[shipmentdetail].[product]))
                           |         |--Compute Scalar(DEFINE:([Expr1021]= -[test].[dbo].[shipmentdetail].[quantity]))
                           |              |--Clustered Index Scan(OBJECT:([test].[dbo].[shipmentdetail].[PK__shipment__3213E83F996CFFF4]))
                           |--Clustered Index Seek(OBJECT:([test].[dbo].[shipment].[PK__shipment__3213E83F4B7B4D07]), SEEK:([test].[dbo].[shipment].[id]=[test].[dbo].[shipmentdetail].[shipment]),  WHERE:([test].[dbo].[shipment].[stock]=[test].[dbo].[shipment].[stock] AND [test].[dbo].[shipment].[date]<[test].[dbo].[shipment].[date]) ORDERED FORWARD)
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849335
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieНу и в том что вы кинули тот же дурацкий план с nested loopsПлан не дурацкий, а нормальный для вашей задачи. Ибо другого не будет.
Предложенные модификации позволят, при наличии соответствующих индексов, уменьшить объем перелопачиваемых данных.

Проблема у вас не в NL и плохости SQL, а в выбранной модели данных - отсутствует таблица текущего наличия. О чем уже не один раз писалось.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849363
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmотсутствует таблица текущего наличия
Что за таблица текущего наличия?
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849364
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_JunkieЧто за таблица текущего наличия?Таблица, где хранятся текущие остатки.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849367
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmNitro_JunkieЧто за таблица текущего наличия?Таблица, где хранятся текущие остатки.
Так мне нужны остатки на дату. А дата может быть и год назад. Чем мне текущие остатки то помогут?
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849372
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkieinvmпропущено...
Таблица, где хранятся текущие остатки.
Так мне нужны остатки на дату. А дата может быть и год назад. Чем мне текущие остатки то помогут?
Откройте для себя Регистр, а не изобретайте велосипед на треугольных колёсах.
...
Рейтинг: 0 / 0
Проблема с оптимизацией IS NOT NULL
    #39849380
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4d_monsterNitro_Junkieпропущено...

Так мне нужны остатки на дату. А дата может быть и год назад. Чем мне текущие остатки то помогут?
Откройте для себя Регистр, а не изобретайте велосипед на треугольных колёсах.

Это в Oracle или в MS SQL как называется? И даже если бы он был, чем мне он в этом запросе поможет? Ну не будет UNION ALL, но проблема то останется.
...
Рейтинг: 0 / 0
70 сообщений из 70, показаны все 3 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с оптимизацией IS NOT NULL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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