Имя: Пароль:
1C
1С v8
Какой запрос будет быстрее
🠗 (Волшебник 10.11.2017 11:12)
0 arsik
 
гуру
09.11.17
15:17
1. Свой вариант 54% (7)
2. Вариант 2 38% (5)
3. Вариант 3 8% (1)
4. Вариант 1 0% (0)
Всего мнений: 13

Вариант 1
ВЫБРАТЬ
    ЗаказНаряд.Ссылка
ИЗ
    Документ.ЗаказНаряд КАК ЗаказНаряд
ГДЕ
    ЗаказНаряд.Основание ССЫЛКА Документ.ЗаказПокупателя
    И ЗаказНаряд.Основание = &Основание


Вариант 2
ВЫБРАТЬ
    ЗаказНаряд.Ссылка
ИЗ
    Документ.ЗаказНаряд КАК ЗаказНаряд
ГДЕ
    ЗаказНаряд.Основание = &Основание


Вариант 3
ВЫБРАТЬ
    ЗаказНаряд.Ссылка
ИЗ
    Документ.ЗаказНаряд КАК ЗаказНаряд
ГДЕ
    (ВЫРАЗИТЬ(ЗаказНаряд.Основание КАК Документ.ЗаказПокупателя)) = &Основание

ЗаказНаряд.Основание - Составной тип - все документы
1 Borteg
 
09.11.17
15:21
2

Вариант 2
2 Джинн
 
09.11.17
15:26
Вы больше времени на написание сабжа потратили, чем потратили бы на замер.
3 arsik
 
гуру
09.11.17
15:27
(2) Для замера нет наполненной базы.
4 ptiz
 
09.11.17
15:28
Пофиг

Свой вариант
5 Dmitrii
 
гуру
09.11.17
15:29
(0) Не будет разницы

Свой вариант
6 DrShad
 
09.11.17
15:29
того что будет быстрее здесь нет

Свой вариант
7 Филиал-msk
 
09.11.17
15:31
(0) До варианта с ТИПЗНАЧЕНИЯ(...) = ТИП(...) не догадался?
8 antgrom
 
09.11.17
15:34
(0) при большом количестве документов , любой запрос содержащий ГДЕ будет долгим.

Свой вариант
9 DrShad
 
09.11.17
15:35
(8) +1
нужно брать из регистров где Основание либо измерение либо часть измерения как в УТ 11
10 Borteg
 
09.11.17
15:40
(9) достаточно проиндексировать реквизит..
11 xXeNoNx
 
09.11.17
15:42
(0) Посмотри план запроса
12 xXeNoNx
 
09.11.17
15:43
вариант 2

Вариант 2
13 Черный маклер
 
09.11.17
15:43
(10) интересный индекс получится у составного реквизита :)
14 Borteg
 
09.11.17
15:44
(0) главное чтобы на реквизите основание был индекс и вариант 2.
вариант 3 самое страшное что можно сделать при составном типе.
15 Borteg
 
09.11.17
15:44
(13) эмм?обычный индекс по ссылке, а что там будет индексироваться еще?
16 Черный маклер
 
09.11.17
15:45
(0) без условия по Дате любой запрос будет неспешным
17 Borteg
 
09.11.17
15:46
(16) сейчас все кластерные индексы в 1с нервно засуетились)
18 arsik
 
гуру
09.11.17
15:56
(7) 8.1 - там такого нет
19 Филиал-msk
 
09.11.17
15:58
(18) Ты прикинь, в 7.7 тоже нет!
20 Dmitry1c
 
09.11.17
15:59
Филиал специальной олимпиады на мисте
21 mistеr
 
09.11.17
16:28
Не будет лишних соединений.

Вариант 2
22 Анцеранана
 
09.11.17
16:59
Согласен с (9).
Если с регистром не взлетает - я за вариант (2) из приведенных, но что-то мне подсказывает, что тут можно как-то быстрее. Возможен ли вариант с ВЫРАЗИТЬ не в ГДЕ, как вы думаете? Может это ОНО как раз?

Свой вариант
23 Филиал-msk
 
09.11.17
17:03
(22) >  Возможен ли вариант с ВЫРАЗИТЬ не в ГДЕ, как вы думаете? Может это ОНО как раз?

Зачем?

(20) Перепись лауреатов
24 mistеr
 
09.11.17
17:04
(22) Зависит от того, что дальше собираемся делать с выбранными доками.
25 DrShad
 
09.11.17
17:09
(24) в данном виде запросов не имеет значения
26 Aloex
 
09.11.17
17:14
Вариант 4 Внутреннее соединение.

Свой вариант
27 Cyberhawk
 
09.11.17
17:45
Сравни планы запросов и тексты запросов СУБД, запили статью на ИС, доложи о результатах
28 Бычье сердце
 
09.11.17
17:50
Выборка = Документы.ЗаказНаряд.Выбрать();
    Пока Выборка.Следующий() Цикл
.....................
29 Бычье сердце
 
09.11.17
17:50
Нормальный вариант.
30 breezee
 
09.11.17
18:03
(13) Вроде по каждой таблице будет индекс
В 1 и 2 вроде(!вроде) на уровня СУБД должно призойти соединение со всем таблицами и составного типа и будет искать, метод поиска будет зависить от того индексирован ли реквизит. Надо бы посомтреть план выполнения, чтобы понять точно что там 1С будет делать и как это оптимизирует СУБД

Вариант 3
31 Numerus Mikhail
 
09.11.17
19:04
(28) Чего уж мелочиться

Найдено = Ложь;
Пока НЕ Найдено Цикл
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ ПЕРВЫЕ 1
    |    ЗаказНаряд.Ссылка
    |ИЗ
    |    Документ.ЗаказНаряд КАК ЗаказНаряд";
    
    Если Выборка.Следующий() Тогда
        Если Выборка.Ссылка.Основание = МоеОснование Тогда
            НужныйДокумент = Выборка.Ссылка;
            Найдено = Истина;
        Иначе
            НенужныйОбъект = Выборка.Ссылка.ПолучитьОбъект();
            НенужныйОбъект.Удалить();
        КонецЕсли;
    КонецЕсли;
КонецЦикла;
32 Лефмихалыч
 
09.11.17
19:22
(31) транзакцию забыл перед циклом
33 Genayo
 
09.11.17
19:37
(3) Могу завтра проверить на базе с 33 млн записей в таблице :)
34 Borteg
 
09.11.17
21:37
(30) Вы о чем?((
35 Borteg
 
09.11.17
21:37
(22) выразить используется только когда получается реквизит через точку от составного типа.
36 ВыборИногда
 
10.11.17
00:02
(0)
Вводные - платформа 8.3.8.2008, количество документов 725107, индекс по полю ДокументОснование

1) План - Index Seek, условие
((T1._Fld18680_TYPE = 0x08 AND T1._Fld18680_RTRef = 0x00005A8B) AND (T1._Fld18680_TYPE = 0x08 AND T1._Fld18680_RTRef = 0x00005A8B AND T1._Fld18680_RRRef = @P2))
Количество чтений 3 шт
2)  План - Index Seek, условие
((T1._Fld18680_TYPE = 0x08 AND T1._Fld18680_RTRef = 0x00005A8B AND T1._Fld18680_RRRef = @P2))
Количество чтений 3 шт
3) План - Index Scan, условие
((CASE WHEN T1._Fld18680_TYPE = 0x08 AND T1._Fld18680_RTRef = 0x00005A8B THEN T1._Fld18680_RRRef END = @P2))
Количество чтений 4361

Итого имеем - третий запрос самый медленный, второй и первый одинаковые, значит условие по ссылке не нужно.
37 youalex
 
10.11.17
00:36
(35) >>выразить используется только когда получается реквизит через точку от составного типа.

Плюс, еще, если нужно ограничить тип полей - в результате запроса или во временной таблице. В случае с вт- без "выразить" в запросе помещения в вт -  зловредность пресловутой "точки" перетекает и в последующие запросы пакета.
Имхо,  это единственный случай, когда стоит использовать "Выразить".
В случае получения реквизита через точку - явное соединение с таблицей (таблицами)  будет и нагляднее и более предсказуемым с точки зрения поведения платформы.
38 Antony8x
 
10.11.17
06:26
2 меньше комманд с БД

Вариант 2
39 Мимохожий Однако
 
10.11.17
06:37
(3) На полупустой базе измерять бессмыссленно. При заполненной базе иногда "неправильные" запросы дадут бОльший эффект.

Свой вариант
40 d4rkmesa
 
10.11.17
11:07
(0) Если Основание проиндексировано, 2 по идее быстрее, но в реальности скорее всего одинаково. 3-й вариант вообще бессмыслен.

Вариант 2