Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
77 / 21 / 3
Регистрация: 19.05.2013
Сообщений: 221
1

Оптимизировать запросы на добавление прайса

15.08.2013, 12:33. Показов 998. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В общем приходят остатки Аптек каждый день, и я получаю из формата *.dbf (сам процесс пропустим) в access 2003 таблицу с этими остатками, название этой таблицы А_ДобавлениеМедпрепаратов, далее выгружаю эти данные уже в другие таблицы. Опишу дальнейший процесс в коде и на словах:
1. Запрос А_ДобавлениеTemp который берет таблицу А_ДобавлениеМедпрепаратов и вносит некоторые коррективы.
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT А_ДобавлениеМедпрепаратов.Аптека, CLng([А_ДобавлениеМедпрепаратов]![Цена]) AS Цена,
IIf(TRIM([А_ДобавлениеМедпрепаратов]![НазваниеПрепарата]) IS NULL 
OR TRIM([А_ДобавлениеМедпрепаратов]![НазваниеПрепарата])="","-",
[А_ДобавлениеМедпрепаратов]![НазваниеПрепарата]) AS НазваниеПрепарата, 
IIf(TRIM([А_ДобавлениеМедпрепаратов]![Страна]) IS NULL OR 
TRIM([А_ДобавлениеМедпрепаратов]![Страна])="","-",[А_ДобавлениеМедпрепаратов]![Страна]) AS Страна,
IIf(TRIM([А_ДобавлениеМедпрепаратов]![Производитель]) IS NULL OR 
TRIM([А_ДобавлениеМедпрепаратов]![Производитель])="","-",[А_ДобавлениеМедпрепаратов]![Производитель]) 
AS Производитель, А_ДобавлениеМедпрепаратов.Сотрудник
FROM А_ДобавлениеМедпрепаратов
WHERE (((А_ДобавлениеМедпрепаратов.Сотрудник)=[Forms]![ГлавноеМеню]![Сотрудник]));

2. Запрос на добавление А_ДобМед3НовыеТоварыБезШтрихКода, суть в том: если пришел новый препарат, то вносится в таблицу как новый.
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
INSERT INTO А_Товары ( Обновление, Сотрудник, Описание_, Страна_, Производитель_ )
SELECT Now() AS Выражение3, Eval([Forms]![ГлавноеМеню]![Сотрудник]) AS Выражение4,
А_ДобавлениеTemp.НазваниеПрепарата, А_ДобавлениеTemp.Страна, 
А_ДобавлениеTemp.Производитель FROM А_ДобавлениеTemp LEFT JOIN 
А_Товары ON (А_ДобавлениеTemp.Производитель = А_Товары.Производитель_) AND 
(А_ДобавлениеTemp.Страна = А_Товары.Страна_) AND (А_ДобавлениеTemp.НазваниеПрепарата = А_Товары.Описание_)
WHERE (((А_Товары.Описание_) IS NULL) AND ((А_Товары.Страна_) IS NULL) AND 
((А_Товары.Производитель_) IS NULL))
GROUP BY Now(), Eval([Forms]![ГлавноеМеню]![Сотрудник]),
 А_ДобавлениеTemp.НазваниеПрепарата, А_ДобавлениеTemp.Страна, А_ДобавлениеTemp.Производитель;

Отступление: прежде чем продолжить я должен описать Запрос на добавление, который состоит из двух запросов на выборку:
a. Запрос на добавление А_ДобМед3НовыеВнести:
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
INSERT INTO А_Объявления ( idТовара, idАптеки, Цена, Действующее, Обновление, Сотрудник )
SELECT А_Товары.id, А_ДобМед3НовыеВнести_.Аптека, А_ДобМед3НовыеВнести_.Цена, 
TRUE AS Выражение2, Now() AS Выражение3, Eval([Forms]![ГлавноеМеню]![Сотрудник]) AS Выражение4
FROM А_ДобМед3НовыеВнести_ INNER JOIN А_Товары ON
 (А_ДобМед3НовыеВнести_.Производитель = А_Товары.Производитель_) AND
 (А_ДобМед3НовыеВнести_.Страна = А_Товары.Страна_) AND
 (А_ДобМед3НовыеВнести_.НазваниеПрепарата = А_Товары.Описание_);

a.1. А_ДобМед3НовыеВнести_
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
SELECT А_ДобавлениеTemp.*
FROM А_ДобавлениеTemp LEFT JOIN А_ДобМед3НовыеВнести__ ON 
(А_ДобавлениеTemp.Производитель = А_ДобМед3НовыеВнести__.Производитель_) AND (А_ДобавлениеTemp.Страна = А_ДобМед3НовыеВнести__.Страна_) AND 
(А_ДобавлениеTemp.НазваниеПрепарата = А_ДобМед3НовыеВнести__.Описание_) AND
 (А_ДобавлениеTemp.Цена = А_ДобМед3НовыеВнести__.Цена) AND 
(А_ДобавлениеTemp.Аптека = А_ДобМед3НовыеВнести__.idАптеки)
WHERE (((А_ДобМед3НовыеВнести__.id) IS NULL));

a.1. А_ДобМед3НовыеВнести__
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
SELECT А_Объявления.*, А_Товары.Описание_, А_Товары.Страна_, 
А_Товары.Производитель_
FROM А_Товары INNER JOIN А_Объявления ON 
А_Товары.id = А_Объявления.idТовара;

3. Запрос А_ДобМед3СтарыеПроставитьДействущие на обновление проверяет если такое наименование было уже в данной Аптеки, то проставляет Действующие=True
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
UPDATE А_ДобавлениеTemp INNER JOIN А_ДобМед3НовыеВнести__ ON (А_ДобавлениеTemp.Производитель = А_ДобМед3НовыеВнести__.Производитель_) AND (А_ДобавлениеTemp.Страна = А_ДобМед3НовыеВнести__.Страна_) AND 
(А_ДобавлениеTemp.НазваниеПрепарата = А_ДобМед3НовыеВнести__.Описание_) AND
 (А_ДобавлениеTemp.Аптека = А_ДобМед3НовыеВнести__.idАптеки) AND
 (А_ДобавлениеTemp.Цена = А_ДобМед3НовыеВнести__.Цена) SET 
А_ДобМед3НовыеВнести__.Действующее = TRUE, А_ДобМед3НовыеВнести__.Сотрудник = [Forms]![ГлавноеМеню]![Сотрудник], А_ДобМед3НовыеВнести__.Обновление = Now();

4. Выполняется тот самый запрос описанный выше "Запрос на добавление А_ДобМед3НовыеВнести" здесь добавляются препараты, которых не было в прошлый раз в этой Аптеки

Вот и все.... Подскажите (дайте совет) как можно оптимизировать запросы, что все работало на порядок быстрее, если возможно. К примеру 30тыс наименований обрабатыватся в среднем секунд 20-30 это очень долго....

P.S. понимаю очень много написано.... код можете не смотреть) мне хотя бы возможно ли такой принцип обработки выполнить секунд за 5 в 30тыс. строк
размер таблиц с приходами столбцов 5-6, кол-во наименований около 30-100тыс за раз

Добавлено через 4 минуты
если нужно, скину кусок базы с этими запросами
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2013, 12:33
Ответы с готовыми решениями:

Запросы на удаление и добавление
Привет! Создаю БД компьютерного оборудования. Импортируется в БД большая общая таблица, затем с...

Запросы на добавление и изменение firebird
Приветствую всех. Существует следующий код подключения к базе Firebird Private Sub...

Задача сравнить два прайса и выделить цену которая отличается от старого прайса
В общем задача. Есть четыре столбца - два с ценами, два с артикулами. Сочетаются попарно:...

Оптимизировать вложенные запросы
Здравия желаю!:drink: Мучаю Nested Sets, но не в них суть. Как можно переделать вот такой...

13
77 / 21 / 3
Регистрация: 19.05.2013
Сообщений: 221
15.08.2013, 13:04  [ТС] 2
бд кусок
Вложения
Тип файла: rar test1.rar (17.4 Кб, 14 просмотров)
0
1390 / 325 / 45
Регистрация: 16.04.2013
Сообщений: 775
Записей в блоге: 2
15.08.2013, 14:20 3
carry-y,
Where
------
Так всё-таки 1 или
Forms]![ГлавноеМеню]![Сотрудник]
в запросах.
----------------------------------
0
Модератор
Эксперт MS Access
11962 / 4830 / 779
Регистрация: 07.08.2010
Сообщений: 14,149
Записей в блоге: 4
15.08.2013, 14:25 4
все достаточно прозрачно, хотя и туго читаемо
заинтересовали только

--dbf-файл(структура, состав)
--разнобой в названиях производителя-товара-страна --коли дбф из разных аптек

----
а 30 секунд на разовую работу --не время
1
77 / 21 / 3
Регистрация: 19.05.2013
Сообщений: 221
15.08.2013, 15:09  [ТС] 5
Цитата Сообщение от Волшебник 307 Посмотреть сообщение
carry-y,
Where
------
Так всё-таки 1 или
Forms]![ГлавноеМеню]![Сотрудник]
в запросах.
----------------------------------
так как формы в приложенную бд я не вставлял, то пускай будет 1 (не принципиально)
Цитата Сообщение от shanemac51
а 30 секунд на разовую работу --не время
----------------------------------
таких файлов будет штук 200 представляете сколько это время займет)
а некоторые файлы вносятся и по 5 минут - 8 минут

я уже многое оптимизировал (не без помощи хороших людей) теперь хочу эти запросы.....
0
77 / 21 / 3
Регистрация: 19.05.2013
Сообщений: 221
15.08.2013, 15:16  [ТС] 6
вот обработанный файл с данными
ну и соответственно для каждой аптеки свой idАптеки
(Штрихкод не нужен, я его забыл удалить)
Миниатюры
Оптимизировать запросы на добавление прайса  
0
Модератор
Эксперт MS Access
11962 / 4830 / 779
Регистрация: 07.08.2010
Сообщений: 14,149
Записей в блоге: 4
15.08.2013, 16:18 7
я думала, что 30сек в день

---
если же 30 сек и более на порцию --вы явно перемудрили

меня смутило при просмотре
--счетчики во временной таблице>900000
--update+join
===========
--сколько в день вам присылают порций и какой объем порции
--причем поле сотрудник в одном из запрсов
Кликните здесь для просмотра всего текста


Запрос: А_ДобавлениеTemp Страница: 6
SQL
SELECT А_ДобавлениеМедпрепаратов.Аптека, CLng(А_ДобавлениеМедпрепаратов!Цена) AS Цена,
IIf(Trim(А_ДобавлениеМедпрепаратов!НазваниеПрепарата) Is Null Or Trim(А_ДобавлениеМедпрепаратов!НазваниеПрепарата)="","-",А_ДобавлениеМедпрепаратов!НазваниеПрепарата) AS НазваниеПрепарата,
IIf(Trim(А_ДобавлениеМедпрепаратов!Страна) Is Null Or Trim(А_ДобавлениеМедпрепаратов!Страна)="","-",А_ДобавлениеМедпрепаратов!Страна) AS Страна,
IIf(Trim(А_ДобавлениеМедпрепаратов!Производитель) Is Null Or Trim(А_ДобавлениеМедпрепаратов!Производитель)="","-",А_ДобавлениеМедпрепаратов!Производитель) AS Производитель,
А_ДобавлениеМедпрепаратов.Сотрудник
FROM А_ДобавлениеМедпрепаратов
``
Запрос: А_ДобМед3НовыеВнести Страница: 7
SQL
INSERT INTO А_Объявления ( idТовара, idАптеки, Цена, Действующее, Обновление, Сотрудник )
SELECT А_Товары.id, А_ДобМед3НовыеВнести_.Аптека, А_ДобМед3НовыеВнести_.Цена, True AS Выражение2, Now() AS Выражение3, Eval(1) AS Выражение4
FROM А_ДобМед3НовыеВнести_ INNER JOIN А_Товары
ON (А_ДобМед3НовыеВнести_.Производитель=А_Товары.Производитель_)
AND (А_ДобМед3НовыеВнести_.Страна=А_Товары.Страна_)
AND (А_ДобМед3НовыеВнести_.НазваниеПрепарата=А_Товары.Описание_);
``
Запрос: А_ДобМед3НовыеВнести_ Страница: 8
SQL
SELECT А_ДобавлениеTemp.*
FROM А_ДобавлениеTemp LEFT JOIN А_ДобМед3НовыеВнести__
ON (А_ДобавлениеTemp.Производитель=А_ДобМед3НовыеВнести__.Производитель_)
AND (А_ДобавлениеTemp.Страна=А_ДобМед3НовыеВнести__.Страна_)
AND (А_ДобавлениеTemp.НазваниеПрепарата=А_ДобМед3НовыеВнести__.Описание_)
AND (А_ДобавлениеTemp.Цена=А_ДобМед3НовыеВнести__.Цена)
AND (А_ДобавлениеTemp.Аптека=А_ДобМед3НовыеВнести__.idАптеки)
WHERE (((А_ДобМед3НовыеВнести__.id) Is Null));
``
Запрос: А_ДобМед3НовыеВнести__ Страница: 9
SQL
SELECT А_Объявления.*, А_Товары.Описание_, А_Товары.Страна_, А_Товары.Производитель_
FROM А_Объявления INNER JOIN А_Товары
ON А_Объявления.idТовара=А_Товары.id;
``
Запрос: А_ДобМед3НовыеТоварыБезШтрихКода Страница: 10
SQL
INSERT INTO А_Товары ( Обновление, Сотрудник, Описание_, Страна_, Производитель_ )
SELECT Now() AS Выражение3, Eval(1) AS Выражение4, А_ДобавлениеTemp.НазваниеПрепарата,
А_ДобавлениеTemp.Страна, А_ДобавлениеTemp.Производитель
FROM А_ДобавлениеTemp LEFT JOIN А_Товары
ON (А_ДобавлениеTemp.НазваниеПрепарата=А_Товары.Описание_)
AND (А_ДобавлениеTemp.Страна=А_Товары.Страна_)
AND (А_ДобавлениеTemp.Производитель=А_Товары.Производитель_)
WHERE (((А_Товары.Описание_) Is Null)
AND ((А_Товары.Страна_) Is Null)
AND ((А_Товары.Производитель_) Is Null))
GROUP BY Now(), Eval(1), А_ДобавлениеTemp.НазваниеПрепарата, А_ДобавлениеTemp.Страна,
А_ДобавлениеTemp.Производитель;
``
Запрос: А_ДобМед3СтарыеПроставитьДействущие Страница: 11
SQL
UPDATE А_ДобавлениеTemp INNER JOIN А_ДобМед3НовыеВнести__
ON (А_ДобавлениеTemp.Производитель=А_ДобМед3НовыеВнести__.Производитель_)
AND (А_ДобавлениеTemp.Страна=А_ДобМед3НовыеВнести__.Страна_)
AND (А_ДобавлениеTemp.НазваниеПрепарата=А_ДобМед3НовыеВнести__.Описание_)
AND (А_ДобавлениеTemp.Аптека=А_ДобМед3НовыеВнести__.idАптеки)
AND (А_ДобавлениеTemp.Цена=А_ДобМед3НовыеВнести__.Цена)
SET А_ДобМед3НовыеВнести__.Действующее = True, А_ДобМед3НовыеВнести__.Сотрудник = 1, ===архивариус отрезал


0
77 / 21 / 3
Регистрация: 19.05.2013
Сообщений: 221
16.08.2013, 09:08  [ТС] 8
Цитата Сообщение от shanemac51 Посмотреть сообщение
--сколько в день вам присылают порций и какой объем порции
--причем поле сотрудник в одном из запрсов
таких порций штук от 45 до 150, у каждой записей по 60-100тыс. просто это напрягает столько времени ждать)
на поле сотрудник внимание не обращайте оно здесь не важно
0
Модератор
Эксперт MS Access
11962 / 4830 / 779
Регистрация: 07.08.2010
Сообщений: 14,149
Записей в блоге: 4
16.08.2013, 11:27 9
попыталась понять порядок выполнения запросов и связь полей -----ухлопола более часа
Кликните здесь для просмотра всего текста

` \\= =t_Товары Запрос---------------не существенно
SELECT ...FROM t_Товары;
------------------------
` \\= =z_ДобавлениеTemp-----------------------выборка1
FROM t_ДобавлениеМедпрепаратов d
WHERE (((d.Сотрудник)=1));
------------------------------------
` \\= =z_ДобМед3НовыеТоварыБезШтрихКода-------добавление нового из выборки1 в товары
INSERT INTO t_Товары
FROM z_ДобавлениеTemp LEFT JOIN t_Товары
WHERE (((t_Товары.Описание_) Is Null)
and ((t_Товары.Страна_) Is Null)
and ((t_Товары.Производитель_) Is Null))

-----------------------------------
` \\= =z_ДобМед3НовыеВнести__-----------------выборка2
FROM t_Товары INNER JOIN t_Объявления
on t_Товары.id=t_Объявления.idТовара;
----------------------------
----------------------------

` \\= =А_ДобМед3СтарыеПроставитьДействущие-----корректировка выборки 2(объявл)
UPDATE z_ДобавлениеTemp т
INNER JOIN z_ДобМед3НовыеВнести__
on (т.Производитель=z_ДобМед3НовыеВнести__.Производитель_)
and (т.Страна=z_ДобМед3НовыеВнести__.Страна_)
and (т.НазваниеПрепарата=z_ДобМед3НовыеВнести__.Описание_)
and (т.Аптека=z_ДобМед3НовыеВнести__.idАптеки)
and (т.Цена=z_ДобМед3НовыеВнести__.Цена)
SET
z_ДобМед3НовыеВнести__.Действующее = True,
z_ДобМед3НовыеВнести__.Сотрудник = 1,
z_ДобМед3НовыеВнести__.Обновление = Now();

-----------------------------выборка3
` \\= =z_ДобМед3НовыеВнести_
FROM z_ДобавлениеTemp LEFT JOIN z_ДобМед3НовыеВнести__
WHERE (((z_ДобМед3НовыеВнести__.id) Is Null));
----------------------------дозапись в объявл
` \\= =z_ДобМед3НовыеВнести
INSERT INTO t_Объявления ( idТовара,
FROM z_ДобМед3НовыеВнести_ INNER JOIN t_Товары

============================
1
77 / 21 / 3
Регистрация: 19.05.2013
Сообщений: 221
16.08.2013, 12:29  [ТС] 10
Цитата Сообщение от shanemac51 Посмотреть сообщение
попыталась понять порядок выполнения запросов и связь полей -----ухлопола
огромное спасибо, сейчас сам буду вникать)
0
0 / 0 / 0
Регистрация: 15.08.2013
Сообщений: 12
16.08.2013, 12:33 11
Попробуй через промежуточную таблицу. Т.е. создай промежуточную таблицу и внеси в неё нормализованные данные. (Если я правильно понял смысл запроса А_ДобавлениеTemp).
0
Модератор
Эксперт MS Access
11962 / 4830 / 779
Регистрация: 07.08.2010
Сообщений: 14,149
Записей в блоге: 4
16.08.2013, 13:17 12
пускала несколько раз(сделала отладочный темр)

в итоге
-в товары записала корректно(по наименование-страна-поставщик)
-в объявлениях же пошли двойники(по ид_товар-аптека-цена)
0
77 / 21 / 3
Регистрация: 19.05.2013
Сообщений: 221
16.08.2013, 13:32  [ТС] 13
Цитата Сообщение от shanemac51 Посмотреть сообщение
пускала несколько раз(сделала отладочный темр)

в итоге
-в товары записала корректно(по наименование-страна-поставщик)
-в объявлениях же пошли двойники(по ид_товар-аптека-цена)
двойники как у вас получились, можно убрать Left Join с условием Is Null
0
0 / 0 / 0
Регистрация: 15.08.2013
Сообщений: 12
16.08.2013, 13:33 14
Цитата Сообщение от shanemac51 Посмотреть сообщение
пускала несколько раз(сделала отладочный темр)
Это кому адресовано? Если мне! То я не понял, что нужно сделать? Помочь в ускорении выполнения запросов или в них есть проблема и надо помочь найти ошибку? Если и то и другое, то было бы не плохо иметь конкретную задачу, что и куда нужно добавить или изменить и какие критерии.
0
16.08.2013, 13:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2013, 13:33
Помогаю со студенческими работами здесь

Как оптимизировать запросы к БД
Есть таблица с огромным количеством столбцов .. около 400 условно можно обозначить которые как...

Как оптимизировать sql запросы?
интересно как вы оптимизируете sql запросы в ваших скриптах поделитесь идеями и опытом ?

Оптимизировать добавление элемента в линейный список
Функция void add_pered() добавляет перед элементов номер 5 нужный нам элемент. Как можно...

Запросы и добавление материала в базу
Привет форумчани, вообщем такая проблема. С начало у меня открывается форма где нужно ввести только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru