Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как упростить запрос ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Привет.

Не могу найти решение, на, казалось бы, простой вопрос. Хочется упростить план следующего запроса.

select id, Title
from MyTable1

where id in (

select id

EXCEPT
SELECT id
FROM Table2 )


[IMG]http://s020.radikal.ru/i709/1510/c1/486f9d11178dt.jpg[/IMG]

Мне не нравится, что обращение к таблице Table1 происходит дважды (скриншоте отмечено цифрами 1 и 2), и, как видите - занимают по 47% времени выполнения всего запроса.

Как быть ?
21 окт 15, 16:00    [18308175]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
скриншот http://s020.radikal.ru/i709/1510/c1/486f9d11178d.png
что то как то криво добавился.
21 окт 15, 16:00    [18308183]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21042
ProBiotek
select id, Title
from MyTable1

where id in (

select id

EXCEPT
SELECT id
FROM Table2 )
А вот ЭТО откуда должно выгребаться?
21 окт 15, 16:03    [18308201]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ProBiotek
Хочется упростить план следующего запроса.

select id, Title
from MyTable1

where id in (

select id

EXCEPT
SELECT id
FROM Table2 )


SELECT 42
21 окт 15, 16:03    [18308203]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Извините. Запрос тоже криво вставил :)


select id, Title
from MyTable1

where id in (

  select id
  from MyTable1

  EXCEPT

  SELECT id
  FROM Table2 
)
21 окт 15, 16:03    [18308208]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
ProBiotek
скриншот http://s020.radikal.ru/i709/1510/c1/486f9d11178d.png
что то как то криво добавился.
Там план другого запроса. Нехорошо.
21 окт 15, 16:04    [18308213]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
Akina
ProBiotek
select id, Title
from MyTable1

where id in (

selectid

EXCEPT
SELECT id
FROM Table2 )

А вот ЭТО откуда должно выгребаться?
Это выгребается из текущей строки внешнего запроса.
21 окт 15, 16:04    [18308217]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Суть в следующем.

Есть таблица запросов (Table2). В ней хранится информация по поданным запросам для организаций (Table1).

Нужно выяснить организации, для которых не было запроса (это делает Внутренний подзапрос).
А затем взять информацию по этим организациям (их Title)
21 окт 15, 16:06    [18308224]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
iap
Там план другого запроса. Нехорошо.

ну там рабочие таблицы.

Я упростил запрос.
Идея просто в том, что внутренний запрос берет данные из Таблицы1. Потом делает Except по таблице2. А затем вынужден снова обратится к Таблице1, чтобы выяснить Title...
21 окт 15, 16:07    [18308235]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ProBiotek
Суть в следующем.

Есть таблица запросов (Table2). В ней хранится информация по поданным запросам для организаций (Table1).

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

NOT EXISTS что ли сделать ?
21 окт 15, 16:07    [18308236]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21042
ProBiotek

select id, Title
from MyTable1

where id in (

  select id
  from MyTable1

  EXCEPT

  SELECT id
  FROM Table2 
)

SELECT id,title
FROM MyTable1 t1
LEFT JOIN MyTable2 t2
ON t1.id=t2.id
WHERE t2.id IS NULL
?
21 окт 15, 16:08    [18308239]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
ProBiotek
Извините. Запрос тоже криво вставил :)


select id, Title
from MyTable1

where id in (

  select id
  from MyTable1

  EXCEPT

  SELECT id
  FROM Table2 
)
Вот!
Уберите FROM из первого запроса EXCEPT.
И не будет двух обращений, как я полагаю.

Но не лучше ли
WHERE NOT EXISTS(SELECT * FROM Table2 WHERE Table2.id=MyTable1.id)
???
21 окт 15, 16:08    [18308240]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
Akina
ProBiotek
select id, Title
from MyTable1

where id in (

  select id
  from MyTable1

  EXCEPT

  SELECT id
  FROM Table2 
)


SELECT id,title
FROM MyTable1 t1
LEFT JOIN MyTable2 t2
ON t1.id=t2.id
WHERE t2.id IS NULL

?
Это не то, ибо неизвестно, сколько записей второй таблицы подходят одной записи первой
21 окт 15, 16:09    [18308251]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21042
iap
неизвестно, сколько записей второй таблицы подходят одной записи первой

Не понял фразы...
21 окт 15, 16:11    [18308264]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
iap
WHERE NOT EXISTS(SELECT * FROM Table2 WHERE Table2.id=MyTable1.id)

???


Помогло !
Спасибо. Вот я затупиил то... Спасибо !
21 окт 15, 16:13    [18308271]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
iap
Это не то, ибо неизвестно, сколько записей второй таблицы подходят одной записи первой


в Таблице2 может быть 1 или 0 записей для строки из Таблицы1.
21 окт 15, 16:14    [18308280]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
Akina
iap
неизвестно, сколько записей второй таблицы подходят одной записи первой

Не понял фразы...
Если Table2.id неуникально, то каждая запись MyTable может попасть в результирующий датасет более одного раза.
А в исходном варианте такого произойти не может.

Вы мне скажете, что имя id предполагает уникальность?
Но нам не представили структуру, - следовательно, это лишь догадка.
21 окт 15, 16:16    [18308296]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
ProBiotek
iap
Это не то, ибо неизвестно, сколько записей второй таблицы подходят одной записи первой


в Таблице2 может быть 1 или 0 записей для строки из Таблицы1.
Не знаю, не знаю...
Начинать вопрос надо с предоставления скрипта таблиц.
Тогда и недоразумений не будет.
21 окт 15, 16:18    [18308301]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21042
iap, ааа... просто мне из описания показалось, что ID - это уникальный идентифицирующий атрибут.
21 окт 15, 16:20    [18308313]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Akina,

конечно. все верно. стандартный ID.

Связка таблиц Таблица2 является просто вспомогательной-расширяющей для Таблицы1.
Хранит даты запросов для организаций из Таблицы1.

В Таблице2 может быть записей меньше чем в Таблица1 - если запросы были не для всех организаций еще; появилась новая организация между запросами
21 окт 15, 16:25    [18308343]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34679
ProBiotek
Привет.

Не могу найти решение, на, казалось бы, простой вопрос. Хочется упростить план следующего запроса.

select id, Title
from MyTable1

where id in (

select id

EXCEPT
SELECT id
FROM Table2 )


[IMG]http://s020.radikal.ru/i709/1510/c1/486f9d11178dt.jpg[/IMG]

Мне не нравится, что обращение к таблице Table1 происходит дважды (скриншоте отмечено цифрами 1 и 2), и, как видите - занимают по 47% времени выполнения всего запроса.

Как быть ?


Вполне себе простой запрос.
21 окт 15, 16:33    [18308384]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4813
ProBiotek
Извините. Запрос тоже криво вставил :)


select id, Title
from MyTable1

where id in (

  select id
  from MyTable1

  EXCEPT

  SELECT id
  FROM Table2 
)


Вы это хотели ?

select id, Title
from MyTable1

where id NOT in (

  SELECT id
  FROM Table2 
)


Что эквивалентно

select t1.id, Title
from MyTable1 T1
LEFT JOIN   Table2 T2 ON t1.id = t2.id 
WHERE t2.id IS NULL 
21 окт 15, 17:20    [18308592]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
если бы не это
Guest
iap
Akina
пропущено...

Не понял фразы...
Если Table2.id неуникально, то каждая запись MyTable может попасть в результирующий датасет более одного раза.
А в исходном варианте такого произойти не может.

Вы мне скажете, что имя id предполагает уникальность?
Но нам не представили структуру, - следовательно, это лишь догадка.

автор
WHERE t2.id IS NULL
21 окт 15, 17:29    [18308650]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
invm
Member

Откуда: Москва
Сообщений: 9683
a_voronin
Что эквивалентно
В общем случае не эквивалентно. iap уже объяснил почему.
21 окт 15, 17:33    [18308678]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить запрос ?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21042
invm
В общем случае не эквивалентно. iap уже объяснил почему.

То есть ты правда думаешь, что записи, у которых НЕТ СООТВЕТСТВИЯ, размножатся?
21 окт 15, 17:38    [18308718]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить