Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Долгий Left Join ускорить или делать временную таблицу? / 7 сообщений из 7, страница 1 из 1
06.11.2014, 17:58:18
    #38797608
AlexSSSS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий Left Join ускорить или делать временную таблицу?
Даны справочник товаров, свойства товаров и цены товаров, остаток утром, проданно:
Код: plsql
1.
2.
3.
create table TOVARY(id integer,kod char(20),name char (120))PRIMARY KEY  (id);
create table TOVARY_sv(id integer,kod char(20),name_sv chare (120),znach char(12)) PRIMARY KEY  (id);
create table chena(id integer,kod char(20),chena numeric(9,2));


Причем на один товар может быть несколько свойств, так и не одного:
таблица TOVARY
Код: plaintext
1.
2.
3.
id    kod    name
1     12     Штука
2     45     Фиговина
3     123    Что-то
Таблица TOVARY_sv
Код: plaintext
1.
2.
3.
id kod  name_sv znach
1  12   Цвет    20_БУКОВ Синий 20БУКОВ</const>ЕЩЕ_КУЧА_БУКОВ
2  12   Вес     20_БУКОВ Тяжолый 20БУКОВ</const>ЕЩЕ_КУЧА_БУКОВ
3  123  Цвет    20_БУКОВ Красный 20БУКОВ</const>ЕЩЕ_КУЧА_БУКОВ
Ну и цены: один товар - одна цена.
"Вяжу" их:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select tii.kod as KOD_TOVARA,tii.`name` as NAZVANIE,
TRIM(MID(tiip.`znach `,20,locate("</const>",tiip.`znach `)-20)) as CVET,
TRIM(MID(tiip1.`znach `,20,locate("</const>",tiip1.`znach `)-20)) as VES
from TOVARY tii
left join TOVARY_sv tiip on (tiip.`kod`=tii.`kod`)
left join TOVARY_sv tiip1 on (tiip1.`kod`=tii.`kod`)
where tii.name like "%ЧТО-ТО%"
and tiip.`name_sv` like "%ЦВЕТ%"
and tiip1.`name_sv` like "%ВЕС%" limit 100


На тестовых табличках все летает со свистом!
Но на реальной БД (TOVARY - более 17 тыс записей, TOVARY_sv -34 с гаком) - время выполнения запроса более минуты. И это я еще не подцепил цены и остатки :-(
Вопрос:
ковырять запрос для его оптимизации? если да - то в каком направлении
или сделать в своем приложении кнопочку "обновить справочник" которую буду нажимать и будет создаваться табличка в которой вся инфа (кроме остатков) сведена в одну "плоскую" таблицу вида:
Код: plaintext
код товара-цена-вес-цвет

и вязать эту таблицу с таблицами остатков?

З.Ы. Аналогичная по функционалу программа писана на фоксе, работает за доли секунды, но это после того как эту БД обработал "конвертер данных". Недостатки: дрневняя как .... мамонта, нет исходников, под линем работает с "бубном", да и надо добавить функционала. Проще переписать заново...
...
Рейтинг: 0 / 0
06.11.2014, 20:29:27
    #38797761
Станислав Клевцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий Left Join ускорить или делать временную таблицу?
AlexSSSS,
получается у вас в одной таблице "TOVARY_sv" хранится информация по весу и цвету товара ?
...
Рейтинг: 0 / 0
06.11.2014, 21:37:47
    #38797802
AlexSSSS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий Left Join ускорить или делать временную таблицу?
Станислав Клевцов, Все верно. Причем по замыслу разработчика тут может храниться скольугодное число свойств товара. Но меня интересуют только два.
...
Рейтинг: 0 / 0
06.11.2014, 21:51:50
    #38797811
Станислав Клевцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий Left Join ускорить или делать временную таблицу?
AlexSSSSСтанислав Клевцов, Все верно. Причем по замыслу разработчика тут может храниться скольугодное число свойств товара. Но меня интересуют только два.

Можно попробовать для "свойства" создать отдельный столбец '***' (числовой) в этой же таблице и его использовать для выборки нужных 2 свойств. Таким образом не будет использоваться в запросе "дорогая" операции like по тексту.
...
Рейтинг: 0 / 0
06.11.2014, 22:53:53
    #38797854
AlexSSSS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий Left Join ускорить или делать временную таблицу?
В том-то и дело что эти таблицы формируются программой от поставщика. По идее - к этой БД доступа вообще нет: для "общения" с внешними системами используются иные БД. Но бяда в том, что ВСЯ необходимая инфа в одном месте есть только тут...
Но направление изысканий понятно: есть возможность заменть LIKE на равно: будет весьма "массивно", но должно сработать.
Спасибо за наводку...
...
Рейтинг: 0 / 0
06.11.2014, 23:51:00
    #38797901
Станислав Клевцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий Left Join ускорить или делать временную таблицу?
AlexSSSSВ том-то и дело что эти таблицы формируются программой от поставщика. По идее - к этой БД доступа вообще нет: для "общения" с внешними системами используются иные БД. Но бяда в том, что ВСЯ необходимая инфа в одном месте есть только тут...
Но направление изысканий понятно: есть возможность заменть LIKE на равно: будет весьма "массивно", но должно сработать.
Спасибо за наводку...

Если нет доступа - это печально (
...
Рейтинг: 0 / 0
07.11.2014, 05:01:08
    #38798064
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий Left Join ускорить или делать временную таблицу?
Станислав Клевцовполучается у вас в одной таблице "TOVARY_sv" хранится информация по весу и цвету товара ?обычный еав, что тут такого?
AlexSSSSНо направление изысканий понятно: есть возможность заменть LIKE на равно: будет весьма "массивно", но должно сработать.+1
лайк (такой, как тут) в принципе не даст вам воспользоваться индексами
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Долгий Left Join ускорить или делать временную таблицу? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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