Имя: Пароль:
 
1C
1С v8
Сколько будет запросов к базе (тестовое задание)
0 sogle
 
24.03.18
09:55
При поиске работы наткнулся на контору с "высокими требованиями и низкой зарплатой", как это обычно бывает.
Один вопрос "со звездочкой" из их анкеты меня заинтересовал.
Вопрос:Сколько запросов будет в трассировщике БД (обращений к БД)?
Запрос.Текст="
ВЫБРАТЬ
ПЕРВЫЕ 1
СкидочныеКарты.Ссылка
ИЗ Справочник.СкидочныеКарты как СкидочныеКарты
ГДЕ СкидочныеКарты.КодКарты=&КодКарты
";
Запрос.УстановитьПараметр("КодКарты","КакойТоТамКодСтрокой");
Ответ: 1 или минимум 2.
1 - тут ежу все понятно, это когда КодКарты это просто строка.
2 - это когда КодКарты элемент Справочника или Перечисление
2 и более это что СоставнойТип чтоли?
1 Asmody
 
24.03.18
10:29
(0) Исходим из того, что в коде нет ошибок. Тогда не может там быть КодКарты нестрокой.
2 Cool_Profi
 
24.03.18
10:40
(1) Это почему?
3 shuhard
 
24.03.18
10:51
(2) "КакойТоТамКодСтрокой"
4 sogle
 
24.03.18
10:59
В процедуру Запрос.УстановитьПараметр("КодКарты","КакойТоТамКодСтрокой");
передается код в виде строки
5 triviumfan
 
24.03.18
12:04
у меня один вопрос: что за бред только что прочитал?
6 H A D G E H O G s
 
24.03.18
12:08
(5) Я подозреваю, что там смысл - не в количестве запросов, а в количестве чтений данных и индексов.
7 toypaul
 
24.03.18
12:11
1 запрос в любом случае. запросов относящихся к данному коду

хотя ... возможен вариант, что первым запросом

будет подготовка, а вторым выполнение с параметрами
8 nva_15
 
24.03.18
12:23
Выражение ГДЕ дает еще один запрос. Так что ответ 2.
9 vde69
 
24.03.18
12:25
запрос к ДАННЫМ будет только один, и он будет из хранимой процедуры а не прямой....

1с давно перешла от прямых вызовов к безопасным чепез ХП


а вообще вопрос глупый, как минимум платворма важна и РЛС
10 Aleksandr N
 
24.03.18
12:25
(0) 42
11 vde69
 
24.03.18
12:26
и еще вопрос - какая субд, уверен в оракле и постгре могут быть нюансы
12 VS-1976
 
24.03.18
12:39
Будет всего 1 запрос. Никаких неявных запросов тут нет
13 sogle
 
25.03.18
08:03
Спасибо всем за комменты. Понял что составитель этого теста не совсем адекватен. Задавать такие вопросы на позицию в 60тыс по МСК это дибилизм.
14 Мимохожий Однако
 
25.03.18
08:23
(13) Тест не прошёл?
15 sogle
 
25.03.18
08:46
(14)Да и хорошо что не прошел. Зачем с такими неадекватами работать.
16 ERWINS
 
25.03.18
08:52
1 запрос


Проверка доступности базы что то типа select 1

Второй запрос отсуствует, так как нет "выполнить" "выгрузить".
17 ERWINS
 
25.03.18
08:54
даже одного не будет.
18 ERWINS
 
25.03.18
08:54
(9) 1с не использует хранимые процедуры.
19 shuhard
 
25.03.18
10:08
(18)[1с не использует хранимые процедуры.]
да ты чё:
8.3.10.2252 + MS SQL 12.0.4100.1(2014)+ тонкий клиент:
три запроса:
exec sp_executesql N'SELECT TOP 1
T1._IDRRef
FROM dbo._Reference10 T1
WHERE (T1._Fld11 = P1)',N'P1 nvarchar(4000)',N'Золотая'

exec sp_executesql N'SELECT
T1._Version
FROM dbo._Reference10 T1
WHERE T1._IDRRef = P1',N'P1 varbinary(16)',0x8488AC220BDA918F11E82FF8E1A9F1C6


exec sp_executesql N'SELECT
T2._IDRRef,
T2._Version,
T2._Marked,
T2._PredefinedID,
T2._Code,
T2._Description,
T2._Fld11
FROM dbo._Reference10 T2
WHERE T2._IDRRef = P1 AND T2._Version <> @P2',N'P1 varbinary(16),@P2 varbinary(8000)',0x8488AC220BDA918F11E82FF8E1A9F1C6,0x00000000000007D1
20 shuhard
 
25.03.18
10:13
(19) +1
расширим выборку реквизитом:
ВЫБРАТЬ ПЕРВЫЕ 1
    СкидочныеКарты.Ссылка КАК Ссылка,
    СкидочныеКарты.КодКарты КАК КодКарты
ИЗ
    Справочник.СкидочныеКарты КАК СкидочныеКарты
ГДЕ
    СкидочныеКарты.КодКарты = &КодКарты

получим - выборку ссылки и реквизита, выборка версии, выборка данных

exec sp_executesql N'SELECT TOP 1
T1._IDRRef,
T1._Fld11
FROM dbo._Reference10 T1
WHERE (T1._Fld11 = P1)',N'P1 nvarchar(4000)',N'Золотая'

exec sp_executesql N'SELECT
T1._Version
FROM dbo._Reference10 T1
WHERE T1._IDRRef = P1',N'P1 varbinary(16)',0x8488AC220BDA918F11E82FF8E1A9F1C6

exec sp_executesql N'SELECT
T2._IDRRef,
T2._Version,
T2._Marked,
T2._PredefinedID,
T2._Code,
T2._Description,
T2._Fld11
FROM dbo._Reference10 T2
WHERE T2._IDRRef = P1 AND T2._Version <> @P2',N'P1 varbinary(16),@P2 varbinary(8000)',0x8488AC220BDA918F11E82FF8E1A9F1C6,0x00000000000007D1
21 shuhard
 
25.03.18
10:15
(20) +1
прямая выборка
SELECT  [_IDRRef]
      ,[_Version]
      ,[_Marked]
      ,[_PredefinedID]
      ,[_Code]
      ,[_Description]
      ,[_Fld11]
  FROM [Кодинг].[dbo].[_Reference10]
даёт
_IDRRef    _Version    _Marked    _PredefinedID    _Code    _Description    _Fld11
0x8488AC220BDA918F11E82FF8E1A9F1C6    0x00000000000007D1    0x00    0x00000000000000000000000000000000    000000001    Золотая    Золотая
0x8488AC220BDA918F11E82FF8E1A9F1C7    0x00000000000007D2    0x00    0x00000000000000000000000000000000    000000002    Платиновая    Платиновая
22 13Дима13
 
25.03.18
10:15
получается минимум 2 запроса, потому что еще выбирается версия?
23 shuhard
 
25.03.18
10:19
(22) минимум 2, составитель теста вменяем в части кодирования,
60000 чудно, но возможно это позиция стажёра
24 13Дима13
 
25.03.18
10:21
(23) я правильно понимаю: если выбирать из таблицы ссылку, то будет минимум 2 запроса, потому что отдельно выбирается версия объекта. Если выбирать реквизит справочника не ссылочного типа (например строковый), то запрос будет 1?
25 shuhard
 
25.03.18
10:24
(24) угу, отказ от ссылки сокращает число выборок
ВЫБРАТЬ ПЕРВЫЕ 1
    СкидочныеКарты.КодКарты КАК КодКарты
ИЗ
    Справочник.СкидочныеКарты КАК СкидочныеКарты
ГДЕ
    СкидочныеКарты.КодКарты = &КодКарты

exec sp_executesql N'SELECT TOP 1
T1._Fld11
FROM dbo._Reference10 T1
WHERE (T1._Fld11 = P1)',N'P1 nvarchar(4000)',N'Золотая'
26 shuhard
 
25.03.18
10:26
(25) ну и классическое Представление
ВЫБРАТЬ ПЕРВЫЕ 1
    СкидочныеКарты.КодКарты КАК КодКарты,
    СкидочныеКарты.Представление КАК Представление
ИЗ
    Справочник.СкидочныеКарты КАК СкидочныеКарты
ГДЕ
    СкидочныеКарты.КодКарты = &КодКарты

exec sp_executesql N'SELECT TOP 1
T1._Fld11,
T1._IDRRef,
T1._Description
FROM dbo._Reference10 T1
WHERE (T1._Fld11 = P1)',N'P1 nvarchar(4000)',N'Золотая'
27 13Дима13
 
25.03.18
10:27
(25) то есть для оптимизации данного запроса, есть смысл в этот запрос добавить выборку версии, наименования, кода и тогда запрос будет 1? или все равно версия отдельно выбираться будет?
28 shuhard
 
25.03.18
10:30
(27) отказ от ссылки и это многократно указано в документации, влечет сокращение выборки
ВЫБРАТЬ ПЕРВЫЕ 1
    СкидочныеКарты.ВерсияДанных КАК ВерсияДанных,
    СкидочныеКарты.ПометкаУдаления КАК ПометкаУдаления,
    СкидочныеКарты.Код КАК Код,
    СкидочныеКарты.Наименование КАК Наименование,
    СкидочныеКарты.КодКарты КАК КодКарты,
    СкидочныеКарты.Предопределенный КАК Предопределенный,
    СкидочныеКарты.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
    СкидочныеКарты.Представление КАК Представление
ИЗ
    Справочник.СкидочныеКарты КАК СкидочныеКарты
ГДЕ
    СкидочныеКарты.КодКарты = &КодКарты

exec sp_executesql N'SELECT TOP 1
T1._Version,
T1._Marked,
T1._Code,
T1._Description,
T1._Fld11,
CASE WHEN T1._PredefinedID > 0x00000000000000000000000000000000 THEN 0x01 ELSE 0x00 END,
T1._PredefinedID,
T1._IDRRef,
T1._Description
FROM dbo._Reference10 T1
WHERE (T1._Fld11 = P1)',N'P1 nvarchar(4000)',N'Золотая'
29 13Дима13
 
25.03.18
10:31
(27) если в этот же запрос добавить ссылку сколько будет запросов?
30 shuhard
 
25.03.18
10:35
(29) 3
ВЫБРАТЬ ПЕРВЫЕ 1
    СкидочныеКарты.ВерсияДанных КАК ВерсияДанных,
    СкидочныеКарты.ПометкаУдаления КАК ПометкаУдаления,
    СкидочныеКарты.Код КАК Код,
    СкидочныеКарты.Наименование КАК Наименование,
    СкидочныеКарты.КодКарты КАК КодКарты,
    СкидочныеКарты.Предопределенный КАК Предопределенный,
    СкидочныеКарты.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
    СкидочныеКарты.Представление КАК Представление,
    СкидочныеКарты.Ссылка КАК Ссылка
ИЗ
    Справочник.СкидочныеКарты КАК СкидочныеКарты
ГДЕ
    СкидочныеКарты.КодКарты = &КодКарты


exec sp_executesql N'SELECT TOP 1
T1._Version,
T1._Marked,
T1._Code,
T1._Description,
T1._Fld11,
CASE WHEN T1._PredefinedID > 0x00000000000000000000000000000000 THEN 0x01 ELSE 0x00 END,
T1._PredefinedID,
T1._IDRRef,
T1._Description,
T1._IDRRef
FROM dbo._Reference10 T1
WHERE (T1._Fld11 = P1)',N'P1 nvarchar(4000)',N'Золотая'

exec sp_executesql N'SELECT
T1._Version
FROM dbo._Reference10 T1
WHERE T1._IDRRef = P1',N'P1 varbinary(16)',0x8488AC220BDA918F11E82FF8E1A9F1C6

exec sp_executesql N'SELECT
T2._IDRRef,
T2._Version,
T2._Marked,
T2._PredefinedID,
T2._Code,
T2._Description,
T2._Fld11
FROM dbo._Reference10 T2
WHERE T2._IDRRef = P1 AND T2._Version <> @P2',N'P1 varbinary(16),@P2 varbinary(8000)',0x8488AC220BDA918F11E82FF8E1A9F1C6,0x00000000000007D1
31 13Дима13
 
25.03.18
10:39
(30) не могу понять в чем смысл 3-его запроса, получается выбираются поля из этой же таблице, где версия данных не равна версии данных из 2-го запроса, но ссылки равны. Разве может в одной таблице храниться 2 записи с одинаковым значением ссылки, но с разным значением версии данных?
32 shuhard
 
25.03.18
10:40
(31)[не могу понять ]
это твои проблемы
33 vde69
 
25.03.18
15:40
(18) 1с только и использует ХП sp_executesql для всех селектов, точно не помню с какой версии, вроде с 8.2 это началось
(24) версионирование поддерживается только с 11 платформы

(0)
возможно сабж идет об трансяции запроса и просмотр результата в плане запросов?

или тут нюанс с РЛС ?

короче думаю сабж не имеет однозначного ответа, а предпологает, что кандидат начнет задавать вопросы
34 sogle
 
26.03.18
09:43
Спасибо всем БОЛЬШОЕ за ответы. Этот вопрос проверял опыт работы с профайлером у кандидата.
35 shuhard
 
26.03.18
09:44
(34) тяжёлый бред
36 Широкий
 
26.03.18
09:49
Миминмум 2
Получение версии и собственно сам запрос. Если RLS - то может быть еще допом
Показ ссылки не выполняется - значит получение представления нет
37 Широкий
 
26.03.18
09:55
+36 Хотя может быть и подъебкой.
"Запрос.Выполнить()" я не вижу