|
ГДЕ ИЛИ СОЕДИНЕНИЕ | ☑ | ||
---|---|---|---|---|
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |