powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация
25 сообщений из 37, страница 1 из 2
Оптимизация
    #40082511
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблица с древесной структурой - структура большой сборки
В одном поле(pth) содержится путь к вершине ну типа 232669-232652-261960-232651-1
есть еще(на всякий случай пишу) поле с уровнем узла в структуре дерева

Требуется: максимально быстро подсчитать количество всех деталей для определенной подсборки
для подсчета количества одной детали используется пользовательская функция, получающая на вход путь к ней в дереве


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Function Getqbp(pth As String) As Long
' получает код детали по М1, возвращает перемноженное позлам до самой вершины количество
Dim rst As DAo.Recordset
Dim qq As Long
Dim str As String
qq = 1
str = Replace(pth, "-", ",")
20 Set rst = CurrentDb.OpenRecordset("SELECT main1.qt from MAIN1 where MAIn1!code in (" & str & ");", dbOpenForwardOnly) ', dbOpenForwardOnly
   If rst.EOF = False Then
      Do Until rst.EOF
               qq = qq * rst.Collect("qt")
               rst.MoveNext
      Loop
       Getqbp = qq
       Exit Function
   Else
       Getqbp = 0
       Exit Function
   End If

End Function



Потом выполняется такой запрос, использующий эту функцию

Код: sql
1.
2.
3.
4.
5.
INSERT INTO temptb ( qt, chnumb, naim, D3d,codever,tp ) 
SELECT Sum(getqbp(tempvygr.pth)) AS qt, MAIN.MARKA, MAIN.COMMENT, vers.d3d,tempvygr.codever,tempvygr.tp 
FROM MAIN INNER JOIN (tempvygr INNER JOIN vers ON tempvygr.codever = vers.code) ON MAIN.CODE = vers.codem 
GROUP BY MAIN.MARKA, MAIN.COMMENT, tempvygr.tp, tempvygr.prod, MAIN.gizd, tempvygr.codever,                   vers.d3d,tempvygr.codever,tempvygr.tp 
ORDER BY tempvygr.tp, MAIN.MARKA, MAIN.COMMENT;


Если его выполнять( для одной некой подсборки - деталей 300 всего) - он выполняется за 2-3 сек. С функцией 30 сек
Можно ли что-нибудь изменить, чтобы ускорить процесс?
Потому что это на моем компе 30 сек, а там где это будет работать - там уже 2 минуты...
...
Рейтинг: 0 / 0
Оптимизация
    #40082512
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg197311
Таблица с древесной структурой - структура большой сборки
В одном поле(pth) содержится путь к вершине ну типа 232669-232652-261960-232651-1
есть еще(на всякий случай пишу) поле с уровнем узла в структуре дерева

Требуется: максимально быстро подсчитать количество всех деталей для определенной подсборки
для подсчета количества одной детали используется пользовательская функция, получающая на вход путь к ней в дереве


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Function Getqbp(pth As String) As Long
' получает код детали по М1, возвращает перемноженное позлам до самой вершины количество
Dim rst As DAo.Recordset
Dim qq As Long
Dim str As String
qq = 1
str = Replace(pth, "-", ",")
20 Set rst = CurrentDb.OpenRecordset("SELECT main1.qt from MAIN1 where MAIn1!code in (" & str & ");", dbOpenForwardOnly) ', dbOpenForwardOnly
   If rst.EOF = False Then
      Do Until rst.EOF
               qq = qq * rst.Collect("qt")
               rst.MoveNext
      Loop
       Getqbp = qq
       Exit Function
   Else
       Getqbp = 0
       Exit Function
   End If

End Function



Потом выполняется такой запрос, использующий эту функцию

Код: sql
1.
2.
3.
4.
5.
INSERT INTO temptb ( qt, chnumb, naim, D3d,codever,tp ) 
SELECT Sum(getqbp(tempvygr.pth)) AS qt, MAIN.MARKA, MAIN.COMMENT, vers.d3d,tempvygr.codever,tempvygr.tp 
FROM MAIN INNER JOIN (tempvygr INNER JOIN vers ON tempvygr.codever = vers.code) ON MAIN.CODE = vers.codem 
GROUP BY MAIN.MARKA, MAIN.COMMENT, tempvygr.tp, tempvygr.prod, MAIN.gizd, tempvygr.codever,                   vers.d3d,tempvygr.codever,tempvygr.tp 
ORDER BY tempvygr.tp, MAIN.MARKA, MAIN.COMMENT;


Если его выполнять( для одной некой подсборки - деталей 300 всего) без этой функции - он выполняется за 2-3 сек. С функцией 30 сек
Можно ли что-нибудь изменить, чтобы ускорить процесс?
Потому что это на моем компе 30 сек, а там где это будет работать - там уже 2 минуты...
...
Рейтинг: 0 / 0
Оптимизация
    #40082513
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От жеж- в место изменить тыкнул в ответить...
...
Рейтинг: 0 / 0
Оптимизация
    #40082517
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg197311
максимально быстро подсчитать количество всех деталей для определенной подсборки

Функция - несерьёзно, накладные расходы велики, плюс куча повторных операций. Собственно, Вы это уже видите.

Изменение структуры хранения - рассматривается?

Я бы вместо "В одном поле(pth) содержится путь к вершине ну типа 232669-232652-261960-232651-1" держал бы дополнительную таблицу (номер узла - номер узла в пути к корню), от самого узла и до корневого включительно (соответственно для показанного узла номер 232669 в этой таблице будет 5 записей).

Или более глубокая оптимизация - с предрасчётом. Ну это если озвученный запрос - и частый, и по времени критичный. Просто при любом изменении пересчитывать нужный показатель для всех зависимых узлов. Ну а в запросе тупо получать заранее рассчитанное значение.
...
Рейтинг: 0 / 0
Оптимизация
    #40082521
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina

Я бы вместо "В одном поле(pth) содержится путь к вершине ну типа 232669-232652-261960-232651-1" держал бы дополнительную таблицу (номер узла - номер узла в пути к корню), от самого узла и до корневого включительно (соответственно для показанного узла номер 232669 в этой таблице будет 5 записей).

.

А вот красного я не понял... У меня сейчас в таблице уже есть code - код узла, и own - код вышестоящего узла...
Как использование доп таблицы может мне помочь?
Функция, использующая code и own работает в 2 раза медленнее чем с pth
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Public Function Getqb(nm1 As Long) As Long
' получает код детали по М1, возвращает перемноженное позлам до самой вершины количество
Dim rst As DAo.Recordset
Dim qq As Long
Dim cn As Long
cn = nm1
qq = 1
20 Set rst = CurrentDb.OpenRecordset("SELECT * from MAIN1 where MAIn1!code=" & cn & ";")
   If rst.EOF = False Then
      qq = qq * rst!qt
      cn = rst!own
      GoTo 20
   Else
       Getqb = qq
       Exit Function
   End If

End Function
...
Рейтинг: 0 / 0
Оптимизация
    #40082522
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina

Или более глубокая оптимизация - с предрасчётом. Ну это если озвученный запрос - и частый, и по времени критичный. Просто при любом изменении пересчитывать нужный показатель для всех зависимых узлов. Ну а в запросе тупо получать заранее рассчитанное значение.

Это сделать можно.... но в крайнем случае, пока не хотелось бы
...
Рейтинг: 0 / 0
Оптимизация
    #40082529
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg197311
Требуется: максимально быстро подсчитать количество всех деталей для определенной подсборки

моя основная задача -СОСТАВ ИЗДЕЛИЯ(уровень вхождения 15+)

основные таблицы
-м01 -(куда, что, применяемость ) количество что в куда
-м40 -наименования деталей/сборок

расчетная таблица
-м05- (изделие, деталь/сборка, комплектация) количество на изделие

любая подсборка (или детали россыпью или группа изделий) могла быть объявлена изделием и просчитана как обычное изделие(трудоемкость, расценки, материалы, на план,...)
+ динамический поиск по части гравировки, наименования, цех, изделие, группа изделий, извещение иб изменении и т.д) и переходом вверх и вниз по иерархии(что входит в рассматриваемую единицу или куда она входит)

устраивала всех : и цеховиков и технологов/конструкторов(хотя у них было и свое дерево)
...
Рейтинг: 0 / 0
Оптимизация
    #40082539
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКА,
Извините, но из вашего поста я смог понять только, что изпользовался один из вариантов предрасчета - табл М05
...
Рейтинг: 0 / 0
Оптимизация
    #40082555
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКА

.....
основные таблицы
-м01 -(куда, что, применяемость ) количество что в куда
-м40 -наименования деталей/сборок 'детали и сборки суть разные вещи

расчетная таблица
-м05- (изделие, деталь/сборка, комплектация) количество на изделие
.....
а по-моему должно быть так:
Изделие 1:М Сборка 1:М деталь
и тривиальный DCOUNT подсчитает число сборок в изделии или число деталей в сборке\изделии-без самописной(и,в данном случае,не оправданно объемной) функции + запрос
...
Рейтинг: 0 / 0
Оптимизация
    #40082588
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гляньте.
Это выборка с некими изменениями из работающей БД-возможны "хвосты" не используемых в примере процедур-разберетесь сами
...
Рейтинг: 0 / 0
Оптимизация
    #40082595
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku,
Вы это к чему???? Я вообще не понял как это относится к заданному вопросу
...
Рейтинг: 0 / 0
Оптимизация
    #40082616
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg197311
А вот красного я не понял... У меня сейчас в таблице уже есть code - код узла, и own - код вышестоящего узла...
Как использование доп таблицы может мне помочь?

Из этой таблицы ты по заданному узлу гребёшь сразу все его составляющие одним простейшим запросом (WHERE номер узла в пути к корню = заданный номер). Ведь, как я понимаю, тебе надо не к корню идти для подсчёта количества, а наоборот, "против шерсти", к конечным узлам.
...
Рейтинг: 0 / 0
Оптимизация
    #40082622
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina, я к сожалению опять не понял... где отличия..
Код: vbnet
1.
Set rst = CurrentDb.OpenRecordset("SELECT main1.qt from MAIN1 where MAIn1!code in (" & str & ");", dbOpenForwardOnly)


Вот этот рекордсет как раз собирает все узлы в цепочке к вершине...
и я иду от корней к вершине....
...
Рейтинг: 0 / 0
Оптимизация
    #40082725
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg197311
sdku,
Вы это к чему???? Я вообще не понял как это относится к заданному вопросу

Serg197311

..Требуется: максимально быстро подсчитать количество всех деталей для определенной подсборки...
к тому что на форме справа куча пустого места где надо разместить подчиненную форму в которой отображаются все нужные Вам подсчеты и данные(для выбранной ноды)-при этом структура должна быть
изделие\" ну типа 232669-232652-261960-232651-1" > сборкиВсоставеИзделия > деталиВсоставеСборки. Источником для построения дерева будет запрос на этих таблицах. Как-то так....
...
Рейтинг: 0 / 0
Оптимизация
    #40082837
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku
Как-то так....

SDKU, я там добавил табличку со структурой одного изделия. поля с путем и уровнем вхождения удалил, что бы не мешали тебе.
Очень прошу, сделай то о чем ты думаешь - так как понять я тебя не могу.
Более того, давай поспорим - чья схема обеспечит более высокое быстродействие при выполнении описанной выше задачи. Я при всех делаю ставку в 3000 р что моя.
Или делай ответную ставку и доказывай - или не засоряй тему больше.
...
Рейтинг: 0 / 0
Оптимизация
    #40082838
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот файл
...
Рейтинг: 0 / 0
Оптимизация
    #40082860
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только без предрасчета - с ним я и сам могу.
...
Рейтинг: 0 / 0
Оптимизация
    #40082875
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg197311,

Результат анализа таблицы MAIN1Имя поляформатразмерЭто просто счетчикcodeДлинное целое4Куда входит – ссылка на счетчик родителяOWNДлинное целое4Конкретное изделие – т.е. на подобные изделия/сборки видимо повторяется вся структура сборок/деталейsernnДлинное целое4Что входит – ссылка на таблицу реальных элементовcodeverДлинное целое4применяемостьqtДвойное с плавающей точкой8
...
Рейтинг: 0 / 0
Оптимизация
    #40082901
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКА, Спасибо! заметил, что с давнего времени у меня там количество - двойное с плав точкой! когда-то была идея заносить в эту структуру еще и материалы( в сборочных чертежах иногда указывается) и с тех пор забыл поменять! сейчас поменяю на integer!
А так - все верно, поля имеют именно такой смысл!
...
Рейтинг: 0 / 0
Оптимизация
    #40082909
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отлично! теперь вместо 30 сек запрос выполняется 19!
...
Рейтинг: 0 / 0
Оптимизация
    #40082930
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg197311,

а если так?


Код: sql
1.
CurrentDb.OpenRecordset("SELECT min(main1.qt) from MAIN1 where MAIn1!code in (" & str & ");", dbOpenForwardOnly) '



ну и не забываем про индекс на поле MAIn1!code
...
Рейтинг: 0 / 0
Оптимизация
    #40082939
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg197311
давнего времени у меня там количество - двойное с плав точкой!

оно и должно быть дробным - например 1 упаковочный ящик на 8 изделий наст применяемость 0,125

у меня 4 дробных разряда
и время выполнения 1 сек - правда я перевела вашу таблицу в свою структуру
ваша таблица раскручивается в рабочую таблицу из 53400 строк, затем суммировка и навигация вверх/вниз

конечно надо проверить, не задвоились ли строки(что-то многовато 53т)
...
Рейтинг: 0 / 0
Оптимизация
    #40082942
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКА
Serg197311
давнего времени у меня там количество - двойное с плав точкой!

оно и должно быть дробным - например 1 упаковочный ящик на 8 изделий дает применяемость 0,125

у меня 4 дробных разряда
и время выполнения 1 сек - правда я перевела вашу таблицу в свою структуру
ваша таблица раскручивается в рабочую таблицу из 53400 строк, затем суммировка и навигация вверх/вниз

конечно надо проверить, не задвоились ли строки(что-то многовато 53т)
...
Рейтинг: 0 / 0
Оптимизация
    #40082945
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКА

- правда я перевела вашу таблицу в свою структуру

а можно ее увидеть?
...
Рейтинг: 0 / 0
Оптимизация
    #40082947
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swa111
Serg197311,

а если так?

ну и не забываем про индекс на поле MAIn1!code

То же не понял... этот запрос выдаст минимальное количество в узлах на пути к вершине... А мне надо перемножить все количества в узлах...
Main1!code- ключевое поле, счетчик
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]