powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с оптимизацией IS NOT NULL
25 сообщений из 70, страница 1 из 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
25 сообщений из 70, страница 1 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с оптимизацией IS NOT NULL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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