77 / 21 / 3
Регистрация: 19.05.2013
Сообщений: 221
|
|||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||
Оптимизировать запросы на добавление прайса15.08.2013, 12:33. Показов 998. Ответов 13
Метки нет (Все метки)
В общем приходят остатки Аптек каждый день, и я получаю из формата *.dbf (сам процесс пропустим) в access 2003 таблицу с этими остатками, название этой таблицы А_ДобавлениеМедпрепаратов, далее выгружаю эти данные уже в другие таблицы. Опишу дальнейший процесс в коде и на словах:
1. Запрос А_ДобавлениеTemp который берет таблицу А_ДобавлениеМедпрепаратов и вносит некоторые коррективы. Кликните здесь для просмотра всего текста
2. Запрос на добавление А_ДобМед3НовыеТоварыБезШтрихКода, суть в том: если пришел новый препарат, то вносится в таблицу как новый. Кликните здесь для просмотра всего текста
Отступление: прежде чем продолжить я должен описать Запрос на добавление, который состоит из двух запросов на выборку: a. Запрос на добавление А_ДобМед3НовыеВнести: Кликните здесь для просмотра всего текста
a.1. А_ДобМед3НовыеВнести_ Кликните здесь для просмотра всего текста
a.1. А_ДобМед3НовыеВнести__ Кликните здесь для просмотра всего текста
3. Запрос А_ДобМед3СтарыеПроставитьДействущие на обновление проверяет если такое наименование было уже в данной Аптеки, то проставляет Действующие=True Кликните здесь для просмотра всего текста
4. Выполняется тот самый запрос описанный выше "Запрос на добавление А_ДобМед3НовыеВнести" здесь добавляются препараты, которых не было в прошлый раз в этой Аптеки Вот и все.... Подскажите (дайте совет) как можно оптимизировать запросы, что все работало на порядок быстрее, если возможно. К примеру 30тыс наименований обрабатыватся в среднем секунд 20-30 это очень долго.... P.S. понимаю очень много написано.... код можете не смотреть) мне хотя бы возможно ли такой принцип обработки выполнить секунд за 5 в 30тыс. строк размер таблиц с приходами столбцов 5-6, кол-во наименований около 30-100тыс за раз Добавлено через 4 минуты если нужно, скину кусок базы с этими запросами
0
|
15.08.2013, 12:33 | |
Ответы с готовыми решениями:
13
Запросы на удаление и добавление Запросы на добавление и изменение firebird Задача сравнить два прайса и выделить цену которая отличается от старого прайса Оптимизировать вложенные запросы |
77 / 21 / 3
Регистрация: 19.05.2013
Сообщений: 221
|
|
15.08.2013, 13:04 [ТС] | 2 |
бд кусок
0
|
Модератор
|
|
15.08.2013, 14:25 | 4 |
все достаточно прозрачно, хотя и туго читаемо
заинтересовали только --dbf-файл(структура, состав) --разнобой в названиях производителя-товара-страна --коли дбф из разных аптек ---- а 30 секунд на разовую работу --не время
1
|
77 / 21 / 3
Регистрация: 19.05.2013
Сообщений: 221
|
|
15.08.2013, 15:09 [ТС] | 5 |
так как формы в приложенную бд я не вставлял, то пускай будет 1 (не принципиально)
Сообщение от shanemac51
а некоторые файлы вносятся и по 5 минут - 8 минут я уже многое оптимизировал (не без помощи хороших людей) теперь хочу эти запросы.....
0
|
77 / 21 / 3
Регистрация: 19.05.2013
Сообщений: 221
|
|
15.08.2013, 15:16 [ТС] | 6 |
вот обработанный файл с данными
ну и соответственно для каждой аптеки свой idАптеки (Штрихкод не нужен, я его забыл удалить)
0
|
Модератор
|
|
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 |
таких порций штук от 45 до 150, у каждой записей по 60-100тыс. просто это напрягает столько времени ждать)
на поле сотрудник внимание не обращайте оно здесь не важно
0
|
Модератор
|
|
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 |
0
|
0 / 0 / 0
Регистрация: 15.08.2013
Сообщений: 12
|
|
16.08.2013, 12:33 | 11 |
Попробуй через промежуточную таблицу. Т.е. создай промежуточную таблицу и внеси в неё нормализованные данные. (Если я правильно понял смысл запроса А_ДобавлениеTemp).
0
|
Модератор
|
|
16.08.2013, 13:17 | 12 |
пускала несколько раз(сделала отладочный темр)
в итоге -в товары записала корректно(по наименование-страна-поставщик) -в объявлениях же пошли двойники(по ид_товар-аптека-цена)
0
|
77 / 21 / 3
Регистрация: 19.05.2013
Сообщений: 221
|
|
16.08.2013, 13:32 [ТС] | 13 |
0
|
0 / 0 / 0
Регистрация: 15.08.2013
Сообщений: 12
|
|
16.08.2013, 13:33 | 14 |
Это кому адресовано? Если мне! То я не понял, что нужно сделать? Помочь в ускорении выполнения запросов или в них есть проблема и надо помочь найти ошибку? Если и то и другое, то было бы не плохо иметь конкретную задачу, что и куда нужно добавить или изменить и какие критерии.
0
|
16.08.2013, 13:33 | |
16.08.2013, 13:33 | |
Помогаю со студенческими работами здесь
14
Как оптимизировать запросы к БД Как оптимизировать sql запросы? Оптимизировать добавление элемента в линейный список Запросы и добавление материала в базу Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |