Имя: Пароль:
1C
 
Как сделать "грязное чтение" по регистру ?
0 ИС-2
 
naïve
31.12.21
09:07
Есть РС к которому обращаются много пользователей. В нем нет кричтиеских данных. Подумал - для повышения скорости работы в нем сделать грязное чтение.
Даже если прочитаются не записанные данные, то не страшно.

Как это можно сделать ?
1 Ёпрст
 
31.12.21
09:17
(0) у тя и так все запросы на чтение идут с хинтом нолок, в скуле, к примеру.
2 Ёпрст
 
31.12.21
09:18
какое еще повышение чтения тебе нужно ?
3 Ёпрст
 
31.12.21
09:18
Нужна скорость - правильно задай структуру, правильно расположи измерения в порядке следования, при необходимости, задай свои покрывающие индексы
4 Ёпрст
 
31.12.21
09:19
в самом скуле, например.
5 pechkin
 
31.12.21
11:28
(1) в транзакции нет
6 2mugik
 
31.12.21
13:02
(5)Счас же версионник моден. Там вроде как без простоев.
7 ДенисЧ
 
31.12.21
13:11
(6) Что значит "моден"? .3 вроде его принудительно включает? Или я что-то подзабыл?
8 fisher
 
31.12.21
13:15
(0) Снимись с ручника. Все уже давно на версионниках работают. И ты тоже, если 1С и сиквел не допотопные. А в них и грязного чтения нет и скорость не хуже.
9 fisher
 
31.12.21
13:19
Или у тебя транзакционное чтение на автоматических блокировках?
10 fisher
 
31.12.21
13:19
Тогда только на управляемые переходить.
11 mistеr
 
31.12.21
14:05
(0) С чего ты взял, что это поможет?

В чем узкое место сейчас?
12 mistеr
 
31.12.21
14:06
(9) Даже на автоматических параллельному чтению ничего не мешает. Блокировки появляются при записи.
13 ИС-2
 
naïve
01.01.22
12:37
Как можно ускорить полученение категории объекта ?

ВЫБРАТЬ
    1 КАК КОЛИЧЕСТВО
ИЗ
    РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
ГДЕ
    КатегорииОбъектов.Объект = &Объект
    И КатегорииОбъектов.Категория = &Категория

такой ерундовый запрос выполняет 2 сек.

Может на обращение к регистру переделать ?
14 ДенисЧ
 
01.01.22
14:07
(13) "ЫБРАТЬ
ИЗ
    РегистрСведений.КатегорииОбъектов"

А сейчас куда обращаешься? Инлексацию проверь
15 dmpl
 
01.01.22
14:18
(13) ВЫРАЗИТЬ в условиях не пробовал? А то объект - наверняка составной тип.
16 pechkin
 
01.01.22
14:20
(15) а как выразить может помочь?
17 Фрэнки
 
01.01.22
14:23
(16) раскрывается запрос в кучку вложенных по каждому типу поля, если в поле условия указан составной тип
18 acht
 
01.01.22
14:25
(0) Если бы программисты 1С были врачами:
https://a.d-cd.net/mg8A31w4-wfn-st2mm8pCeYcNRY-960.jpg
19 pechkin
 
01.01.22
14:26
(17) называется слышал звон, но не понял где он.
То что ты описал - это про доступ через точку
20 Sapiens_bru
 
01.01.22
15:06
(13) Посмотреть реальный текст запроса на SQL сервере. Посмотреть план запроса. Если нужные доступы есть, если нет - начать с их получения. Не играть в угадайку.

Могу с этим помочь (бесплатно). Напиши на [email protected]
21 ИС-2
 
naïve
03.01.22
14:36
(20) спасибо. Как будет доступ в профайлер - напишу.

чуть ускорил за счет приведения к типу. Что еще можно выжать ?
ВЫБРАТЬ
    1 КАК КОЛИЧЕСТВО
ИЗ
    РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
ГДЕ
    Выразить(КатегорииОбъектов.Объект как Документ.ЗаказПокупателя) = &Объект
    И КатегорииОбъектов.Категория = &Категория и КатегорииОбъектов.Объект ссылка Документ.ЗаказПокупателя
22 H A D G E H O G s
 
03.01.22
15:04
(21) выжать из руководства доступ к профайлеру
23 Armando
 
03.01.22
16:17
(21) В структуре регистра измерение Объект переместить на первое место.
24 SuperMario
 
04.01.22
12:01
(0) Вангую, что у вас УТ 10.3/УПП 1.3 судя по названию регистра (нашел его в УТ 10.3)
Если так, то у вас 1С  с автоматическими блокировками и режимом совместимости 8.2.16 или чуть старше.

Я что-то не знаю, как из 1с можно управлять хинтами WITH(NOLOCK) или, как сейчас пишется в СУБД перед выполнение запроса  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

(15) это называется разименование полей составного типа.

(16) никак. Только хуже сделаете.
(20) можно глянуть.

(21) сделали  хуже. Вы не правильно используете Выразить(КатегорииОбъектов.Объект как Документ.ЗаказПокупателя) = &Объект
В плане запроса это будет CAST(....)  Это выражение над индексным полем. СУБД- шник свалится из Index SEEK в Index SCAN. А это, по сути, сканирование всей таблицы , т.к. индекс кластерный.

(23) если  никто не трогал рег, то Объект там на первом месте в индексе.

Не видел полного текста запроса с применением данного регистра.
Я бы смотрел в сторону:
- избавиться от полей составного типа.
- пересмотреть запрос.

Например:

Выбрать Первые 1 Объект, КатегорииОбъектов  Из  РегистрСведений.КатегорииОбъектов Где КатегорииОбъектов.Объект =&Объект И КатегорииОбъектов.Категория = &Категория  

Ничего больше вы не выжмите из этого.


Жду критики)))
25 pechkin
 
04.01.22
12:03
Разве выразить дает каст? Вроде только для преобразования чисел-строк
26 acht
 
04.01.22
12:12
(24) > плане запроса это будет CAST(....)  
(25) > для преобразования чисел-строк

Какие еще будут варианты?
27 SuperMario
 
04.01.22
12:15
(25) даст. Специально нашел фрагмент курса Богачева В. где он сам признается, что раньше неправильно использовал Выразить (...). Есть пруфы.
28 acht
 
04.01.22
12:17
(27) > Есть пруфы
Где?
29 SuperMario
 
04.01.22
12:23
(28) из курса подготовки эксперта по технологическим вопросам Виктора Богачева.

Могу план запроса прислать в личку (не поленюсь и сделаю). Извините , к курсу доступ не предоставлю. Скрины могу)
30 acht
 
04.01.22
12:27
(29) > в личку
Сюда. И исходный запрос.
31 ДенисЧ
 
04.01.22
12:29
(29) Ты стесняешься своего плана запроса? Может, ты хочешь об этом поговорить?
32 SuperMario
 
04.01.22
12:32
(31) lol

Немного терпения.
33 Ёпрст
 
04.01.22
12:43
без выразить
ГДЕ
    КатегорииОбъектов.Объект = &Объект
    И КатегорииОбъектов.Категория = &Категория и КатегорииОбъектов.Объект ссылка Документ.ЗаказПокупателя



SELECT
P1
FROM dbo._InfoRg18552 T1
WHERE (T1._Fld18553_TYPE = 0x08 AND T1._Fld18553_RTRef = 0x00000170 AND T1._Fld18553_RRRef = 0x00000000000000000000000000000000) AND (T1._Fld18554RRef = @P2) AND (T1._Fld18553_TYPE = 0x08 AND T1._Fld18553_RTRef = 0x00000170)',N'P1 numeric(10),@P2 varbinary(16)',1,0xAC312DA6B9DCB5A540FFB200F5CA1D1D

с выразить
ГДЕ
    Выразить(КатегорииОбъектов.Объект как Документ.ЗаказПокупателя) = &Объект
    И КатегорииОбъектов.Категория = &Категория и КатегорииОбъектов.Объект ссылка Документ.ЗаказПокупателя

SELECT
P1
FROM dbo._InfoRg18552 T1
WHERE ((CASE WHEN T1._Fld18553_TYPE = 0x08 AND T1._Fld18553_RTRef = 0x00000170 THEN T1._Fld18553_RRRef END) = 0x00000000000000000000000000000000) AND (T1._Fld18554RRef = @P2) AND (T1._Fld18553_TYPE = 0x08 AND T1._Fld18553_RTRef = 0x00000170)',N'P1 numeric(10),@P2 varbinary(16)',1,0xAC312DA6B9DCB5A540FFB200F5CA1D1D
34 SuperMario
 
04.01.22
12:46
SELECT
T1._Fld908_TYPE,
T1._Fld908_RTRef,
T1._Fld908_RRRef,
T1._Fld909RRef
FROM dbo._InfoRg907 T1
WHERE ((CASE WHEN T1._Fld908_TYPE = 0x08 AND T1._Fld908_RTRef = 0x0000008C THEN T1._Fld908_RRRef END) = P1) AND (T1._Fld909RRef = @P2)',N'P1 varbinary(16),@P2 varbinary(16)',0xB43218C04D22528811EC6C5A46022BC7,0x00000000000000000000000000000000
35 SuperMario
 
04.01.22
12:47
(33) перепутал CAST с CASE Мои извинения, невнимателен чуть ((

В любом случае -это выражение над индексируемым полем
36 Ёпрст
 
04.01.22
12:49
И..реальный план выполнения запрос там одинаковый
37 acht
 
04.01.22
12:51
(35) > перепутал CAST с CASE
Воот. А то напугал =)
38 SuperMario
 
04.01.22
12:51
(37)  Да, страдаю этим немного :-)
39 SuperMario
 
04.01.22
12:52
(37) я же писал, что "жду критики"! Спасибо , что поправили)
40 fisher
 
04.01.22
15:09
(12) На автоматических блокировках чтению будет мешать запись. А на управляемых на версионнике - не будет. Сабж ведь про грязное чтение. Значит ему запись мешает, раз он грязным чтением ускорить пытается.
41 fisher
 
04.01.22
15:31
(13) 2 секунды? Очень странно, если Объект первым измерением стоит или вторым после категории или по Объект есть доп-индекс (то есть если отбор попадает в индекс с хорошей селективностью). Тогда это какая-то аномалия. Пересчет статистики сделать как вариант. Не поможет - переиндексацию. Не поможет - глянуть план выполнения, что же он такого делает. Оптимальный он или нет.
42 SuperMario
 
04.01.22
16:08
(40) Для перевода на версионник базу нужно активно дорабатывать напильником. Я не думаю, что это будет выход при данной проблеме.
Поэтому только оптимизация. Я подозреваю, что данное решение еще и обновляется?))

(41) автор  притих ツ
43 ManyakRus
 
04.01.22
16:14
(21) "Выразить..." - первый раз написали а второй раз нет -
"Объект" - два раза в запросе и выразить надо 2 раза.
один раз бесполезно :-)
44 ИС-2
 
naïve
04.01.22
16:29
(42) не, я внимательно читаю.

В итоге как ускорить обращений к регистру категории объектов
45 fisher
 
04.01.22
16:45
(44) >  я внимательно читаю
А если будешь внимательно писать, то сможешь читать больше ответов по делу.
Озвучь хотя бы структуру регистра, порядок измерений и доп-индексы если они есть.
46 SuperMario
 
04.01.22
18:22
(45)
Там все просто, как в автомате Калашникова)

Два измерения и все

Объект (тип Документ.Ссылка, Справочник.Ссылка)
КатегорииОбъектов (тип Справочник.КатегорииОбъектов)
47 SuperMario
 
04.01.22
18:28
ИМХО. Тема довольно большая по причинам длительного выполнения запроса.
Прежде чем хотеть "грязных чтений" нужно  ответить на вопрос: "А все ли сделано для того, что бы опуститься до такого уровня"?
Какие-то вбросы в тему не дадут истинной причины.

Поэтому все выглядит как (18)
48 ИС-2
 
naïve
06.01.22
13:54
(41) блокировки управляемые

Где изучить как интерпритировать SQL запрос, чтобы понять правильный он или нет
49 ДенисЧ
 
06.01.22
14:06
(48) Если запрос делает 1с - он правильный.
50 fisher
 
06.01.22
14:14
(41) > блокировки управляемые
Если управляемые блокировки, то затыка по блокировкам быть не должно, если ты их сам не организовал.
> Где изучить как интерпритировать SQL запрос, чтобы понять правильный он или нет
Не SQL запрос. План его выполнения. Гугли "как посмотреть план выполнения запроса". Там будет отражено на какой операции сколько времени тратится. Если сам интерпретировать его не сможешь - выкладывай сюда скриншот. Или загугли "как читать план выполнения запроса". Сиквел даже умеет помогать с анализом: https://docs.microsoft.com/ru-ru/sql/relational-databases/performance/analyze-an-actual-execution-plan?view=sql-server-ver15
51 ИС-2
 
naïve
06.01.22
14:37
спасибо, буду читать. Пока вот такой запрос

сейчас попробую его текст в 1C найти, но он не типовой

exec sp_executesql N'SELECT
T1._Fld32118
FROM dbo._InfoRg32114 T1 WITH(NOLOCK)
WHERE (T1._Fld32116RRef = P1) AND (T1._Fld32115RRef = @P2) AND (T1._Fld32117 = -@P3)',N'P1 varbinary(16),@P2 varbinary(16),@P3 numeric(10)',0x96F744A8421C39D411EC696E82026EDA,0x9C98002219A6A0CC11E4542512A11633,1
52 pechkin
 
06.01.22
14:47
(51) ну тут собственно и так грязное чтение
53 Ёпрст
 
06.01.22
19:24
(51) T1._Fld32117 - это че за реквизит\ресурс\измерение у тебя ? И где в твоём тексте запроса условие на него =1 ?
54 pechkin
 
06.01.22
20:18
2 поля объект и 1 категория
55 acht
 
06.01.22
20:29
(54) > 2 поля объект

Три различных самостоятельных поля:
_Fld32116RRef,
_Fld32115RRef
_Fld32117

И это, похоже, вообще не регистр категорий.
56 Ёпрст
 
06.01.22
21:31
ага, и в тексте запроса он выбирает не константу = 1, а поле. И нет условия на тип реквизита, а просто условие на ссылку.Так что, одна из черепашек врёт  - это не РС категориииОбъектов
Основная теорема систематики: Новые системы плодят новые проблемы.