Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с оптимизацией IS NOT NULL / 25 сообщений из 70, страница 1 из 3
12.08.2019, 10:57
    #39848148
Nitro_Junkie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с оптимизацией IS NOT NULL
Делали тут небольшое сравнение СУБД и нарвались на вот какую проблему:

Запрос:

Код: 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
12.08.2019, 11:05
    #39848161
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с оптимизацией IS NOT NULL
А почему вы задокументированное поведение называете проблемой? Тут нет никакой проблемы.
...
Рейтинг: 0 / 0
12.08.2019, 11:33
    #39848181
Nitro_Junkie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с оптимизацией IS NOT NULL
CammomileА почему вы задокументированное поведение называете проблемой? Тут нет никакой проблемы.

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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

Если бы можно было сделать триггер на представление balance все делалось бы одной строчкой. А так вариантов которые приведут к тому что останет меньше 0 сотни. Куда что вставлять?
...
Рейтинг: 0 / 0
12.08.2019, 14:54
    #39848339
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с оптимизацией IS NOT NULL
остаток не должен расчитываться, он должен записываться
...
Рейтинг: 0 / 0
12.08.2019, 15:53
    #39848383
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с оптимизацией IS NOT NULL
Nitro_JunkieЕсли бы можно было сделать триггер на представление balance все делалось бы одной строчкой.Ну так делайте. Или что-то мешает?
...
Рейтинг: 0 / 0
12.08.2019, 16:28
    #39848416
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с оптимизацией IS NOT NULL
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
12.08.2019, 17:27
    #39848456
Nitro_Junkie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с оптимизацией IS NOT NULL
Konst_Oneостаток не должен расчитываться, он должен записываться

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

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


не надо для этого делать представления, программа должна уже расчитанный остаток зхаписывать в отдельную таблицу
...
Рейтинг: 0 / 0
12.08.2019, 17:31
    #39848460
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с оптимизацией IS NOT NULL
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
12.08.2019, 17:31
    #39848461
Nitro_Junkie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с оптимизацией IS NOT NULL
Владислав Колосов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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с оптимизацией IS NOT NULL / 25 сообщений из 70, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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