Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / if exists / 16 сообщений из 16, страница 1 из 1
10.04.2021, 11:12
    #40061316
muk07
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
Есть оператор select, данные из которого используются для построения документа в word или excel.
Прежде чем его запускать, я проверяю - не пустой ли результат у этого select
Делаю if exists(select...)
Есть случаи, когда этот select возвращает несколько сотен тысяч записей. Это занимает около минуты.
Казалось бы реализация exists могла бы прекратить работу как только появится 1 запись. Но нет - select
выполняется полностью.
Надеюсь на совет на какой бы козе это объехать?
Все пробы делал из management studio.
...
Рейтинг: 0 / 0
10.04.2021, 11:36
    #40061318
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
muk07,

EXISTS проверяет наличие только первой записи.
...
Рейтинг: 0 / 0
10.04.2021, 11:38
    #40061319
muk07
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
Получается что нет - весь запрос.
if exists выполняется около минуты
...
Рейтинг: 0 / 0
10.04.2021, 11:39
    #40061320
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
muk07,

1. Первую запись можно получить и через день, если она заблокирована.
2. Некоторые операции перед тем, как отдать хотя бы одну запись, требуют обработки всего входного набора. Например, сортировка или hash join.
...
Рейтинг: 0 / 0
10.04.2021, 11:57
    #40061323
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
muk07
Надеюсь на совет на какой бы козе это объехать?

1. Оптимизировать запрос - см. выше про сортировку и/или hash join.
2. Результат запроса залить во временную таблицу/табличную переменную, if exists выполнять на запросе из них, отдавать выборку тоже из них.
...
Рейтинг: 0 / 0
10.04.2021, 12:44
    #40061329
muk07
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
Спасибо за мысль о сортировке - сработало после добавления индекса, но не радикально.
Проблема снялась после упрощения запроса - для if exists запрос сделал попроще,
а прежде использовал полный запрос предназначенный для построения документа
...
Рейтинг: 0 / 0
11.04.2021, 01:54
    #40061414
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
if exists (select top 1 1 from myTable) ?
...
Рейтинг: 0 / 0
11.04.2021, 11:52
    #40061433
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
SIMPLicity_
if exists (select top 1 1 from myTable) ?


Ваще то, документировано, что в exists все, что до "from myTable where" ни на что не влияет.

top 1 или 1 вместо * - абсолютно фиолетово.
...
Рейтинг: 0 / 0
11.04.2021, 12:38
    #40061437
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
aleks222
SIMPLicity_
if exists (select top 1 1 from myTable) ?


Ваще то, документировано, что в exists все, что до "from myTable where" ни на что не влияет.

top 1 или 1 вместо * - абсолютно фиолетово.


Согласен. Помню об этом. Тем не менее, проверил на таблице из 60 тыс. строк с условием по полю nvarchar(max) с условием like '%...%' . Результаты идентичные в пределах погрешности 1-2% (миллисекунды "плясали" туда-сюда).

PS После чтения статьи о перепитиях реализация комманды XCHNG в интелловских процессорах (сколько аппаратных циклов затрачивается на неё) готов к чему бы ни было : "хочешь быть уверенным проверь дважды...., и ещё разочек,- но уже на другом оборудовании"
...
Рейтинг: 0 / 0
11.04.2021, 13:42
    #40061439
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
aleks222
SIMPLicity_
if exists (select top 1 1 from myTable) ?


Ваще то, документировано, что в exists все, что до "from myTable where" ни на что не влияет.

top 1 или 1 вместо * - абсолютно фиолетово.
Не совсем фиолетово. В SELECT могут использоваться только существующие поля таблицы.
Общепринято писать SELECT *
...
Рейтинг: 0 / 0
11.04.2021, 14:18
    #40061447
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
iap
aleks222
пропущено...


Ваще то, документировано, что в exists все, что до "from myTable where" ни на что не влияет.

top 1 или 1 вместо * - абсолютно фиолетово.
Не совсем фиолетово. В SELECT могут использоваться только существующие поля таблицы.
Общепринято писать SELECT *


Ну да, вместо select update писать нельзя.
...
Рейтинг: 0 / 0
11.04.2021, 14:26
    #40061451
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
aleks222
iap
пропущено...
Не совсем фиолетово. В SELECT могут использоваться только существующие поля таблицы.
Общепринято писать SELECT *


Ну да, вместо select update писать нельзя.
UPDATE нельзя, но список полей-то хоть можно?
...
Рейтинг: 0 / 0
12.04.2021, 00:09
    #40061531
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
Может быть и фиолетово, но что вернет запрос, если select * и пользователю запрещено читать хотя бы один столбец, входящий в эту *?
...
Рейтинг: 0 / 0
12.04.2021, 03:06
    #40061547
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
В проверках на exists лучше писать SELECT 0 (ну или любую другую константу). Это потенциально уменьшит количество последующих переделок, если в будущем где-то в цепочке "таблица-вьюха-функция-процедура-итд" потребуется добавить SCHEMABINDING.
...
Рейтинг: 0 / 0
12.04.2021, 21:50
    #40061844
godsql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
Что вы спорите-то? :)
Если судить по задаче, то наиболее выгодный (общеупотребительный) вариант предложил Сон Веры Павловны (п.2)
А, в дальнейшем, лично я бы, учитывая пожелания ТС ( if exists(..)), воспользовался бы переменной @@rowcount и не возился с exists'oм
...
Рейтинг: 0 / 0
13.04.2021, 07:01
    #40061888
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if exists
godsql
Что вы спорите-то? :)
Если судить по задаче, то наиболее выгодный (общеупотребительный) вариант предложил Сон Веры Павловны (п.2)
А, в дальнейшем, лично я бы, учитывая пожелания ТС ( if exists(..)), воспользовался бы переменной @@rowcount и не возился с exists'oм

Кто на ком стоял? Ты хоть понял?

Тредстартер желает СНАЧАЛА проверить, а потом молотить чудовищный запрос.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / if exists / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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