![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Поисковый запрос примерно такого вида:
select *, CONCAT_WS(" ", DOG_SER, DOGNUMB) as FULL_NUM,
CONCAT_WS(" ", car.CAR_MARK, car.CAR_MODEL) as FULL_MODEL,
car.ID_CLIENT as ID_OWNER,
CONCAT_WS(" ", client.surname, client.name, client.middlename) as FULL_NAME , CONCAT_WS(", ", if(client.country = '', null, client.country), if(client.region = '', null, client.region), if(client.town = '', null, client.town), if(client.street = '', null, client.street), if(client.home = '', null, client.home), if(client.korpus = '', null, client.korpus), if(client.flat = '', null, client.flat)) as FULL_ADDRESS from dogovor, dogovor_type, client, car, car_type where ((dogovor.ID_DOGOVOR_TYPE = dogovor_type.ID_DOGOVOR_TYPE) and (dogovor.ID_CLIENT = client.ID_CLIENT) and (dogovor.ID_CAR = car.ID_CAR)) and (car.ID_CAR_TYPE = car_type.ID_CAR_TYPE) and
(DOGNUMB like '%123%' )
or
dogovor.ID_CLIENT in (
select ID_CLIENT from client, client_types where
((SURNAME like '%Петрова%' ) and (client_types.ID_CLIENT_TYPE_GROUP = 1 and client_types.ID_CLIENT_TYPE = client.ID_CLIENT_TYPE))
or
((DOC_SER like '%12%' ) and ID_TYPE_DOC = 0))
or
dogovor.ID_CAR in (
select ID_CAR from car where
(VIN_NUM like '%000%' ))Как не сложно догадаться, при выполнении такого запроса, всё намертво зависало.
Сейчас я попытался его оптимизировать, сделал таким:
select *,
CONCAT_WS(" ", car.CAR_MARK, car.CAR_MODEL) as FULL_MODEL,
car.ID_CLIENT as ID_OWNER,
CONCAT_WS(" ", client.surname, client.name, client.middlename) as FULL_NAME ,
CONCAT_WS(", ", if(client.country = '', null, client.country), if(client.region = '', null, client.region), if(client.town = '', null, client.town), if(client.street = '', null, client.street), if(client.home = '', null, client.home), if(client.korpus = '', null, client.korpus), if(client.flat = '', null, client.flat)) as FULL_ADDRESS
from dogovor_type, car_type, client_types,
dogovor join car on
(dogovor.ID_CAR = car.ID_CAR) and (VIN_NUM like '%000%')
,
dogovor dg1 join client on
(dg1.ID_CLIENT = client.ID_CLIENT) and
(SURNAME like '%Петрова%' )
or
((DOC_SER like '%12%' ) and ID_TYPE_DOC = 0)
where (dogovor.ID_DOGOVOR_TYPE = dogovor_type.ID_DOGOVOR_TYPE) or
(dogovor.DOGNUMB like '%123%' )
and
(car.ID_CAR_TYPE = car_type.ID_CAR_TYPE)
and
(client_types.ID_CLIENT_TYPE_GROUP = 2 and client_types.ID_CLIENT_TYPE = client.ID_CLIENT_TYPE);Всё-равно: "Ну и запросы у вас, - сказала СУБД и зависла." ![]()
Как его возможно оптимизировать? С учётом того, что функциональность like %*% крайне желательно сохранить, и запрос должен иметь достаточно "регулярную", простую структуру, чтобы его было возможно было формировать динамически?
Отредактированно Артём Н. (30.04.2010 13:24:39)
Неактивен

Она не зависла, а задумалась ![]()
Любой LIKE "%blah%" — это полное сканирование таблицы. Вы это используете
в двух табличках. Допустим, у Вас есть две таблички — небольшие — по 100
строк. Для того, чтобы выполнить Ваш запрос, надо просканировать
100 × 100 = 10 000 строк. А если таблички больше — то больше. Остальные слова
в запросе влияют уже мало — пока остаются такие LIKE — ничего не сделаешь.
Задумайтесь, например, о полнотекстовом индексе.
Неактивен