|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4.
Подскажите, как такие запросы переписывать более оптимально и возможно ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 18:36 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
Дык, не допускать null в ячейке таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 18:38 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
Hamber Код: sql 1. 2. 3. 4.
Подскажите, как такие запросы переписывать более оптимально и возможно ли? На все три условия лень расписывать (там ведь пересечение вариантов, код пухнет, и вовсе не факт, что в итоге будет быстрее работать), но для одного условия это делается так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 18:48 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
Ну можно так. Код: sql 1. 2. 3. 4.
но это монопениссуарно. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 18:49 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
uaggster, а если перед селектом выполнить: Код: sql 1. 2. 3.
то можно Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 09:40 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
Oleg_SQL, ну, при этом вы отключите parameter sniffing. Это не безусловно хорошо, и не безусловно плохо, но нужно понимать, что в следствие этого произойдет. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 10:32 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
uaggster Oleg_SQL, ну, при этом вы отключите parameter sniffing. Это не безусловно хорошо, и не безусловно плохо, но нужно понимать, что в следствие этого произойдет. Речи о ХП не было... Тогда так? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
; ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 10:53 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
Oleg_SQL, это вам мало что даст в плане оптимизации. Хотя конечно для краткости и понятности кода это лучше. isnull по переменной движком сервера будет определён один раз и далее будет использовано это значение. А вот isnull по полю будет отрабатывать как раз для каждой строки. Чего и нужно избегать. Поэтому надо делать так, как я написал выше. Но так как у вас три поля фильтруется с условием по нуллу, то так просто не сделать. Вы не можете сделать два блока, в которых будет не нулл и нулл. Потому что это уже будет другое условие. Ведь каждое поле может принимать значение нулл независимо от остальных. Значит надо пойти путём разбиения запроса на подзапросы. Надо оценить кол-во данных, которые выдаёт запрос, если условием оставить только одно поле. Затем создать временную таблицу, которую заполнить запросом по тому полю, которое даёт наименьшее кол-во строк. Ессно этот запрос должен выдавать два остальных поля в качестве значений результирующего набора. Этот запрос делать так, как я указал выше с двумя блоками. А уже эту временную таблицу фильтровать по оставшимся двум полям не заморачиваясь на оптимизацию и красивости по нуллам. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 11:00 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
Кесарь Поэтому надо делать так, как я написал выше. Кесарь Значит надо пойти путём разбиения запроса на подзапросы. Надо оценить кол-во данных, которые выдаёт запрос, если условием оставить только одно поле. Затем создать временную таблицу, которую заполнить запросом по тому полю, которое даёт наименьшее кол-во строк. Ессно этот запрос должен выдавать два остальных поля в качестве значений результирующего набора. Делать надо как предложено в 22327012 . Это, в отличие от ваших монструозных предложений, не только проще и эффективнее, но еще и саргабельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 11:37 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
invm Кесарь Поэтому надо делать так, как я написал выше. Кесарь Значит надо пойти путём разбиения запроса на подзапросы. Надо оценить кол-во данных, которые выдаёт запрос, если условием оставить только одно поле. Затем создать временную таблицу, которую заполнить запросом по тому полю, которое даёт наименьшее кол-во строк. Ессно этот запрос должен выдавать два остальных поля в качестве значений результирующего набора. Делать надо как предложено в 22327012 . Это, в отличие от ваших монструозных предложений, не только проще и эффективнее, но еще и саргабельно. Вопрос был про оптимизацию, а не синтаксический сахар. И сам uaggster, предложивший этот красивый способ, в отличие от вас это понимает. А почему "не надо" и тем более "от словам совсем", неплохо бы обосновывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 11:45 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
Кесарь Вопрос был про оптимизацию, а не синтаксический сахар И что же вы наоптимизировали? У вас же не улучшение, а ухудшение. Причем кратное. И по читабельности, и по производительности, и по трудозатратам. Кстати, uaggster ошибся написав "но это монопениссуарно". Потому что его вариант саргабельный, в отличие от остальных предложенных. Ну и на досуге почитайте, что же такое "синтаксический сахар". ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 12:32 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
invm Кстати, uaggster ошибся написав "но это монопениссуарно". Потому что его вариант саргабельный , в отличие от остальных предложенных. А саргабельный - это как? Нашел только 2 странички с использованием этого слова. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 14:01 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
uaggster, вот эти же? https://www.sql.ru/forum/316502/sargable-i-non-sargable-zaprosy https://en.wikipedia.org/wiki/Sargable ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 14:06 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
Shakill, гм... спасибо. Не знал, что для "ускоряется индексами" существует отдельный термин. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 14:51 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
uaggster Shakill, гм... спасибо. Не знал, что для "ускоряется индексами" существует отдельный термин. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 18:36 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
iap uaggster Shakill, гм... спасибо. Не знал, что для "ускоряется индексами" существует отдельный термин. Что значит "применимость"? Любой индекс, содержащий + - нужные поля (в ключевых и include) может быть применен для любого запроса по этим самым полям. Например - этот индекс может быть просканирован. И кстати, в варианте ТС, если подходящий индекс существует, так и будет, скорее всего, сделано. Не факт, конечно, что индекс по полям field1, field2, field3 может существовать, т.к. он там DECLARE @pole1 Varchar(max) делает, х.з. что из себя field1 представляет. Ну ладно, пусть у него поля там varchar(255) какие-нибудь. Тогда индекс будет использован и будет сканироваться. И в варианте с intersect, кстати, скорее всего тоже. Вот пример: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Так что индекс применим в обоих случаях. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 08:31 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
Ситуация, правда, радикально меняется, если не допускать идиотизма, и декларировать переменные правильно: Код: sql 1.
Тогда индекс не просто используется, но используется максимально эффективно. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 08:36 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
uaggster iap пропущено... При чём здесь ускорение? Применимость индексов для запроса. Что значит "применимость"? Любой индекс, содержащий + - нужные поля (в ключевых и include) может быть применен для любого запроса по этим самым полям. Например - этот индекс может быть просканирован SARGable - SEARCH argument able, это свойство именно предиката. не данных и не фактически имеющихся индексов. имеется в виду, что для полей, упомянутых в предикате, теоретически можно построить такой индекс, который приведет к Seek по этим полям. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 14:15 |
|
ISNULL() = ISNULL()
|
|||
---|---|---|---|
#18+
Shakill SARGable - SEARCH argument able , это свойство именно предиката. не данных и не фактически имеющихся индексов. имеется в виду, что для полей, упомянутых в предикате, теоретически можно построить такой индекс, который приведет к Seek по этим полям. Во, теперь понятно. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 16:49 |
|
|
start [/forum/topic.php?fid=46&fpage=23&tid=1684659]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 296ms |
total: | 429ms |
0 / 0 |