Имя: Пароль:
1C
 
как правильно в Запросе?
🠗 (Волшебник 07.09.2022 12:43)
0 DES
 
05.09.22
15:56
с точки зрения быстродействия
ГДЕ Док.Проведен И Док.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)

или

ГДЕ Док.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ) И Док.Проведен

Проведен - точно индексируется в SQL и Дата - тоже? тогда без разницы?
1 Волшебник
 
05.09.22
15:56
Отбор по периоду важнее
2 grasshoper
 
07.09.22
10:11
я всегда первыми ставлю условия отсекающие большую часть записей. понятное дело что в 98% случаев документ проведен, а в период он может не попасть.
3 Kassern
 
07.09.22
10:13
(0) правильнее ВиртуальнаяТаблцица(&НачалоПериода,&КонецПериода)
4 RomaH
 
naïve
07.09.22
10:30
И Док.Дата >= НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ)
И Док.Дата <= КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)
5 НафНаф
 
07.09.22
10:31
"Проведен - точно индексируется в SQL" - зачем индексировать булево значение?
6 Святой Нос
 
07.09.22
11:00
(2) > я всегда первыми ставлю условия

Ты хочешь сказать, что "Условие1 И Условие2" работает иначе, чем "Условие2 И Условие1"
7 Святой Нос
 
07.09.22
11:01
?
8 RomaH
 
naïve
07.09.22
11:04
(6) а то - по И - если первое условие ложь, то второе не выполняется (не расчитывается)
9 Святой Нос
 
07.09.22
11:10
(8) А вот Microsoft почему-то пишет, что "The order of evaluation of logical operators can vary depending on choices made by the query optimizer" - https://docs.microsoft.com/ru-ru/sql/t-sql/queries/search-condition-transact-sql?view=sql-server-ver15

Как так-то?
10 DEVIce
 
07.09.22
11:11
Я думаю что без разницы, скуль сам поставит поток как надо.
11 Kassern
 
07.09.22
11:12
(9) +1
SQL в общем случае - это декларативный язык. Вы говорите что хотите получить, но не говорите как. СУБД сама решает, как именно получать ваши данные.
12 RomaH
 
naïve
07.09.22
11:13
странно
если я пишу так:

Где А/0 > 0 И Ложь - в ошибку
Где Ложь И А/0 > 0 - нет ошибки
13 Kassern
 
07.09.22
11:15
(12) Попробуйте на большой таблице сделать отбор с парой условий "И", а потом поменяйте их местами и сравните время выполнения.
14 Kassern
 
07.09.22
11:15
все это проверяется за пару минут
15 Святой Нос
 
07.09.22
11:22
(12) Ты вообще не там воюешь.

ВЫБРАТЬ 10 КАК Поле1 ПОМЕСТИТЬ Времянка;
ВЫБРАТЬ * ИЗ Времянка ГДЕ Поле1/0 > 0 И ЛОЖЬ;
16 Ryzeman
 
07.09.22
11:24
(15) SQL умнеее программистов)
17 RomaH
 
naïve
07.09.22
15:08
(16) это только кажется

ВЫБРАТЬ
    10 КАК Поле1
ПОМЕСТИТЬ втТаблица

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    9
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    8
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    7
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    6
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    5
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    4
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    3
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    1
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втТаблица.Поле1 КАК Поле1
ИЗ
    втТаблица КАК втТаблица
ГДЕ
    ЛОЖЬ
    ИЛИ (втТаблица.Поле1 > 5 И 10 / (Поле1 - 5) > 0)
    //ИЛИ 10 / (Поле1 - 5) > 0 И (втТаблица.Поле1 > 5)
18 RomaH
 
naïve
07.09.22
15:09
и я вполне сознательно пользуюсь таким поведением
если у меня бывают исключения в выражении, но я могу их исключить в первом условии - то вполне применительно
Программист всегда исправляет последнюю ошибку.