Имя: Пароль:
1C
1С v8
ГДЕ ИЛИ СОЕДИНЕНИЕ
0 kolja24
 
17.10.13
10:14
Добрый день.
Есть справочник Контрагентов и регистр сведений с измерением Контрагент.
Нужно выбрать Контрагентов из справочника, которые отсутствуют в регистре. Первое, что приходит на ум это в условии - ГДЕ Контрагент НЕ В (Списке). Можно ли это же сделать соединением? Что будет работать быстрее? И самое главное, не соображу какое должно быть условие соединения ПО?
1 wPa
 
17.10.13
10:15
ГДЕ ЕСТЬNULL
2 Maxus43
 
17.10.13
10:15
соединение
+ где поле ЕСТЬ NULL
3 1dvd
 
17.10.13
10:16
(1) +
ПО
   Контрагент.Ссылка = РегистрСведений.Контрагент
4 Classic
 
17.10.13
10:16
Условие ПО должно быть обычным, а вот потом в ГДЕ ЕСТЬ NULL
5 Нуф-Нуф
 
17.10.13
10:16
левое соединение по контрагенту и где контрагент есть нул
6 andreymongol82
 
17.10.13
10:16
Сколько же таких вопросов будет, одинаковых?
7 GANR
 
17.10.13
10:22
(0) Операция IN, по словам знатоков SQL - это то же самое замаскированное соединение. Много раз запускал планы запроса - по показателю COST одно и то же.

Доподлинно на этот вопрос ответит план запроса - СУБД для одного и того же запроса может построить множество совершенно разные планов выполнения - одно и то же соединение может быть реализовано и как цикл в цикле (NESTED LOOPS), и как один проход по 2-м отсортированным таблицам (MERGE JOIN) в зависимости от того, какие индексы используются и какие объемы данных (если данных в таблице менее 20 - индексы использовать нерационально).
8 Infsams654
 
17.10.13
10:34
(7) сумневаюсь я однако. Ежели IN из select, то возможно, а если из простого перечисления IN ("а", "в" ...
9 viktor_vv
 
17.10.13
10:38
(8) Из простого перечисления то же самое. Там это перечисление ("а","в") загоняется скулем в слежуебную табличку и дальше как обычно.
10 viktor_vv
 
17.10.13
10:44
(9) Если быть точнее, то при небольшом количестве элементов условие IN ("а","в"...) разворачивается в плане запроса в несколько (Поле = "а" или Поле = "в" ...), а при большем количестве элементов уже через служебную табличку и соединения.
11 viktor_vv
 
17.10.13
10:45
Вот насчет конкретных цифр при каком количестве элементов в списке какой вариант выполнения выбирает скуль не скажу, не знаю.
12 GANR
 
17.10.13
12:56
(11) Можно ли вообще узнать алгоритм выбора плана запроса или это коммерческая тайна Майкрософт?
13 Fragster
 
модератор
17.10.13
13:02
14 ptiz
 
17.10.13
13:03
Только тестить на конкретном запросе и конкретной БД.
15 viktor_vv
 
17.10.13
13:37
(12) Не знаю, но есть такое чувтство что толку от этого алгоритма особого не будет, так как при выборе плана запроса учитывается много всякой внутренней хрени о состоянии БД.
16 kolja24
 
17.10.13
23:30
Спасибо всем за советы. В моем случае быстрей выполняется запрос с соединениями, хотя разница совсем небольшая и немного меняется при разных параметрах.
Запрос с ГДЕ, если его выполнять сразу же второй раз, выполняется намного быстрей. В то же время, скорость повторного выполнения запроса с соединениями не меняеться.
17 viktor_vv
 
18.10.13
01:09
(16) То что написано в (7) и в моих постах это относится к  просто Где В () и внутреннему соединению.
Вот с Где НЕ В () все может быть по другому, точно не помню как оно разворачивается.
18 GANR
 
18.10.13
12:01
(16) Наверное, запрос с ГДЕ кэширует все это безобразие. Его имеет смысл, по-ходу, выполнять в том случае, если запрос выполняется с периодичностью, превышающей время жизни этого кэша.
19 GANR
 
18.10.13
12:02
+(18) Пардон, имеет смысл, если периодичность запроса меньше периода жизни кэша.
20 Ненавижу 1С
 
гуру
18.10.13
12:04
я знаю как решить эту задачу тремя способами:
1. через конструкцию В к подзапросу
2. через левое соединение и проверку NULL
3. через объединение в подзапросе и суммирование (извращенный метод!)
21 GANR
 
18.10.13
15:12
(20) Третий способ для 7.7 без 1С++ - ни конструкцию В (внутри другого запроса) нельзя сделать, ни ЛЕВОЕ СОЕДИНЕНИЕ.
22 Infsams654
 
18.10.13
15:22
(20) Вы про Oracle и другие бд забываете. Oracle не любит временные таблицы, вернее любит, но места на освобождает, в отличие от ms
Основная теорема систематики: Новые системы плодят новые проблемы.