Имя: Пароль:
1C
1С v8
Как оптимизировать запрос, возвращающий 1,5 млн записей?
,
0 memogolik
 
16.12.14
15:12
Есть простой запрос:
ВЫБРАТЬ
    количество(ОбъектыИнформационныхБаз.Объект)
ИЗ
    РегистрСведений.ОбъектыИнформационныхБаз КАК ОбъектыИнформационныхБаз
(результат =  1.5млн )
Который выдает результат за несколько секунд.
Но если к нему добавить условие:
ГДЕ
    ОбъектыИнформационныхБаз.Объект.ПометкаУдаления
то система повисает на часы. Я подозреваю, что это из за того, что ОбъектыИнформационныхБаз.Объект имеет составной тип данных. Посоветуйте, как получить данные с условием по этому запросу.
Заранее спасибо за ответы.
1 Господин ПЖ
 
16.12.14
15:14
собирай запрос демонически по метаданным и склеивай через объединить все
2 DirecTwiX
 
16.12.14
15:18
(1) Можно без "ОБЪЕДИНИТЬ ВСЕ"
3 memogolik
 
16.12.14
15:18
(1) ок, как например отобрать все объекты с типом РТиУ?
4 vicof
 
16.12.14
15:20
(3) ССЫЛКА + ВЫРАЗИТЬ
5 Крошка Ру
 
16.12.14
15:20
(3) ВЫРАЗИТЬ(ОбъектыИнформационныхБаз.Объект КАК Документ.РТиУ)
6 DirecTwiX
 
16.12.14
15:20
7 exwill
 
16.12.14
15:22
(0) Если у тебя полтора миллиона объектов, то ... у тебя полтора миллиона объектов. Тут сильно не ускориться не удастся.
8 Vladal
 
модератор
16.12.14
15:24
Название темы должно отражать суть сообщения
9 memogolik
 
16.12.14
15:28
(6) Спасибо, буду курить ссылку. Раньше в связи с малым опытом не сталкивался с "ВЫРАЗИТЬ".
(8) Прошу прошения.
Если не сложно как преобразовать мой запрос, чтобы получить результат?
10 DirecTwiX
 
16.12.14
15:32
выбор
   когда А.Ссылка ССЫЛКА Документ.Док1
      тогда (выразить А.Ссылка КАК Документ.Док1).ПометкаУдаления
   когда А.Ссылка ССЫЛКА Документ.Док2
      тогда (выразить А.Ссылка КАК Документ.Док2).ПометкаУдаления
   когда А.Ссылка ССЫЛКА Документ.Док3
      тогда (выразить А.Ссылка КАК Документ.Док3).ПометкаУдаления
   Конец
ИЗ
   РегистрСведений.ОбъектыИнформационныхБаз КАК А
11 memogolik
 
16.12.14
15:34
(10) Огромное спасибо!
12 brznzglwgn
 
16.12.14
15:35
(0) Можно попробовать -
Условие ГДЕ заменить на объединение с Документ.ХХХ по Объект = Ссылка и дальше уже наложить условие ГДЕ на Документ.ХХХ.ПометкаУдаления.

Или чтото подобное как в (10)..

Главное сделать прозрачным текст запроса, вместо того во что платформа превратит его после выборки через точку. И уже дальше смотреть на тесты.
13 МихаилМ
 
16.12.14
15:37
(10)
и получите перемножение таблиц + избыточные блокировки.

а

в (1) сложение таблиц + распараллеливание.
14 H A D G E H O G s
 
16.12.14
15:39
(0) Ты удалить хочешь?
15 H A D G E H O G s
 
16.12.14
15:39
(14) Регистр почистить?
16 memogolik
 
16.12.14
15:40
(14) Да, хочу удалить записи, для помеченных на удаление объектов
17 ИС-2
 
naïve
16.12.14
15:51
(0) а если 1,5 млн записей просто перебрать в цикле?
18 МихаилМ
 
16.12.14
15:53
+(17)
и удалять по одной. вот подход истинного адинэсника - рисовальщика формочек.
19 H A D G E H O G s
 
16.12.14
15:53
(16) Выбирай сначало наибольший по количеству тип и получай его пометку через выразить()

ВЫБРАТЬ
    СУММА(1) КАК Количество,
    ТИПЗНАЧЕНИЯ(ОбъектыИнформационныхБаз.Объект) КАК Тип
ИЗ
    РегистрСведений.ОбъектыИнформационныхБаз КАК ОбъектыИнформационныхБаз

СГРУППИРОВАТЬ ПО
    ТИПЗНАЧЕНИЯ(ОбъектыИнформационныхБаз.Объект)

УПОРЯДОЧИТЬ ПО
    Количество УБЫВ
20 H A D G E H O G s
 
16.12.14
15:53
Потом следующий, когда очистишь эти значения, и.т.д.
21 DirecTwiX
 
16.12.14
15:57
(13) В (1) тоже перемножение есть.
Откуда блокировки и распараллеливание?
Разве одно обращение к таблице не лучше чем несколько?
22 Господин ПЖ
 
16.12.14
16:01
>В (1) тоже перемножение есть

ловите наркомана
23 АНДР
 
16.12.14
16:03
(2) Без "Объеденить все" будет медленнее.
24 Жан Пердежон
 
16.12.14
16:03
(13) можно про блокировки подробнее, можно даже не про избыточные?
25 DirecTwiX
 
16.12.14
16:06
(22) Будет то же соединение таблицы регистра с таблицей документов.
26 H A D G E H O G s
 
16.12.14
16:11
(24) Особенно в свете хинта "NOLOCK".
27 Господин ПЖ
 
16.12.14
16:13
>NOLOCK

руками его не поставить, а сам он только в списках есть... или уже не так все?
28 МихаилМ
 
16.12.14
16:13
(21)

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

+ расход памяти.
это касаемо блокировочников.

для версионников подобные гипер перемножения - тоже тяжёлая задача.

а при  объединении нужно только следить, чтобы не было пересечения выборок КИ, тк в случае страничных блокировок

может возникнуть эффект взаимо блокировки внутри запроса.
  

для удаления записей не рекомендуется удалять сразу все 1.5

можно спокойно порциями. например с разделением по видам и типам объектов.
29 H A D G E H O G s
 
16.12.14
16:16
(27) 1С это сделает за тебя.

  ВЫБРАТЬ ПЕРВЫЕ 1
    ОбъектыДоступаДокументов.ДокументСсылка,
    ОбъектыДоступаДокументов.ВидОбъектаДоступа,
    ОбъектыДоступаДокументов.ОбъектДоступа
ИЗ
    РегистрСведений.ОбъектыДоступаДокументов КАК ОбъектыДоступаДокументов


SELECT TOP 1
T1._Fld15625_TYPE,
T1._Fld15625_RTRef,
T1._Fld15625_RRRef,
T1._Fld23121RRef,
T1._Fld15626_TYPE,
T1._Fld15626_RTRef,
T1._Fld15626_RRRef
FROM _InfoRg15624 T1 WITH(NOLOCK)
30 H A D G E H O G s
 
16.12.14
16:17
(29) Да и вообще 1С делает этот запрос вне транзакции.
31 H A D G E H O G s
 
16.12.14
16:23
Слово предоставляется МихаилМ
32 Господин ПЖ
 
16.12.14
16:28
(29) это чистый православный 8.3 без совместимостей и т.п. костылей?
33 H A D G E H O G s
 
16.12.14
16:32
(32) Это прекрасный 8.2.19 в режиме совместимости Версия 8.2.13

УПП короче.
34 H A D G E H O G s
 
16.12.14
16:32
(32) Это давно так. Давна у нас много.
35 Жан Пердежон
 
16.12.14
16:34
(27) в списках, отчет, запросах вне транзакции...
разве когда-то было иначе?
36 H A D G E H O G s
 
16.12.14
16:36
(35) Сколько себя помню, осознавшего SQL часть 1С - было так.
Но может раньше (олдфаги помнють) - было по другому, вот и не спорю.
37 H A D G E H O G s
 
16.12.14
16:37
Ждем МихаилМ, нашедшего здесь блокировки.
38 DirecTwiX
 
16.12.14
16:41
Про распараллеливание тоже интересно.
39 H A D G E H O G s
 
16.12.14
16:43
(38) Особенно с учетом max degree of parallelism =1, который рекомендуют ставить для OLTP систем.
40 Necessitudo
 
16.12.14
16:44
NOLOCK это же Read Uncommited.
41 H A D G E H O G s
 
16.12.14
16:46
(40) Да.
42 Necessitudo
 
16.12.14
16:47
(41) А что будет, если сделать стопицот запросов к одной и той же таблице?
43 МихаилМ
 
16.12.14
16:47
(37)
у блокировочника блокировки есть и на чтение  

не важно даже если указан nolock.


(38)

mssql запросы union пытается распараллелись.

эти запросы могут заблокировать друг друга
версии до 2008 сгенерируют ошибку "intra-query parallelism deadlocks"

начиная  2008 - ошибка тайм аута.
44 H A D G E H O G s
 
16.12.14
16:54
(43) "у блокировочника блокировки есть и на чтение   "

Вне транзакции?

(43) "mssql запросы union пытается распараллелись. "

Даже для режима max degree of parallelism=1 ?
45 Лефмихалыч
 
16.12.14
17:04
(0) рекомендую ознакомиться
http://infostart.ru/public/184361/
46 Господин ПЖ
 
16.12.14
17:15
(34) запустил в консоли запросец - точно, выскакивает nolock... а я только про списки помню... надо перечитать матчасть
47 H A D G E H O G s
 
16.12.14
17:16
(43) Смотрю блокировки через sp_lock, не вижу никаких при выполнении запроса к РС.
48 H A D G E H O G s
 
16.12.14
17:38
(43) Будут комментарии (44) ?
49 MM
 
16.12.14
17:41
(44) В этом случае ставится кратковременная блокировка, снимаемая после завершения операции считывания. Нужна чтобы не прочесть данные не завершённых транзакций.
50 H A D G E H O G s
 
16.12.14
17:48
(49) Нет.
51 МихаилМ
 
16.12.14
18:05
(48) сделайте перемножение таблиц
52 H A D G E H O G s
 
16.12.14
18:10
(51) Именно их и делал, иначе как бы я блокировки смотрел бы запросом, сформированным из 1С.
53 H A D G E H O G s
 
17.12.14
13:33
Подниму ветку и продолжу вопрошать МихаилМ, который нашел здесь блокировки и параллелизм.
54 Sammo
 
17.12.14
13:48
А помеченные на удаление обхекты в РС нужны? Может при пометке удалять его из регистра?
55 compors
 
17.12.14
14:13
(43) > версии до 2008 сгенерируют ошибку "intra-query parallelism deadlocks"
начиная  2008 - ошибка тайм аута.

Вот отложенцы.
56 brznzglwgn
 
17.12.14
14:29
(53) +++
Вечно кто-то придет, [хитроумную вещь про SQL скажет и ретируется..
57 H A D G E H O G s
 
17.12.14
14:31
(56) Как правило - чушь.