![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как избежать лишний трафик? [D7, MySQL]
sargos © (2003-08-19 03:22:00)
Как избежать лишний трафик?
Уважаемые знатоки, что вы можете посоветовать в такой ситуации:
Среда: Mysql -> Delphi7 -> DBExpress
Для упрощения понимания привожу часть БД.
Таблицы в отношениях Мастер - Деталь:
Мастер таблица "work" - таблица для хранения значений констант
(SQLQuery -> DataSetProvider -> ClientDataSet -> DataSource)
Поле Тип Ноль Ключ
c_id smallint(3) Нет primary key, auto_increment
pr smallint(2) Нет index //поле связи
val1 varchar(30) Да //хранимое значение
val2 varchar(15) Да //хранимое значение
Деталь таблица "comment" таблица для хранения примечаний (примечания
используются не часто, нет смысла каждый раз их грузить на клиента +
в БД несколько таблиц использующих примечания).
(SQLTable -> DataSetProvider -> ClientDataSet -> DataSource)
Поле Тип Ноль Ключ
kl_id smallint(3) Нет index //поле связи с таблицей work "константы"
za_id mediumint(8) Нет index //поле связи c таблицей zayavka "заявка"
primech varchar(250) Да //текст примечания
Связь по полям kl_id -> c_id
Все нормально работает, но при анализе трафика...
При активизации ClientDataSet (мастер таблица) выполняется запрос:
select * from work where (pr = "3") order by val1 //ну тут все понятно :)
а вот для деталь таблицы :(
select * from comment //Зачем это? Клиенту полностью грузится таблица примечаний!
И она не используется! Так как следом выполняется запрос:
select * from comment where (kl_id = "49")
--------------------------------
При использовании SQLQuery вместо SQLTable программа завершается с сообщением об ошибке в
dbexpmysql.dll
При использовании SQLDataSet вместо SQLTable получаем:
1. SQLDataSet -> CommandType -> ctTable
SQLDataSet -> CommandText -> comment
select * from comment //То-же самое
select * from comment where (kl_id = "49") //То-же самое
2. SQLDataSet -> CommandType -> ctQuery
SQLDataSet -> CommandText -> select * from comment
select * from comment where (kl_id = "49")
select * from comment where (kl_id = "49")
- запрос выполняется два раза, что уже лучше, но почему два раза?
Может быть я что-то не так делаю?
Подскажите пожалуйста что мне делать в данной ситуации.
Заранее благодарен.
sargos (2003-08-20 04:31:00) [1]
>1) Рекомендую вместо dbexpress поставить библиотеку прямого доступа к мускулу ZeosLib.
Установил ZeosDBO, выполнил ваши рекомендации, теперь порядок.
Большое спасибо!
sargos (2003-08-20 04:29:00) [2]
>А лукапные поля есть? Если есть, то из-за них.
Нет, таких полей нет.
>Не маловато число для ключа. Если в БД максимум 999 записей то и трафика особого не предвидится.
В таблице констант будет присутствовать максимум 150-200 записей,
но дело не в этом, еще ряд таблиц в отношениях Мастер-Деталь с таблицей примечаний её используют
za_id mediumint(8) Нет index //поле связи c таблицей zayavka "заявка"
или тут можно что-то улучшить?
Nikolay M. (2003-08-19 10:47:00) [3]
1) Рекомендую вместо dbexpress поставить библиотеку прямого доступа к мускулу ZeosLib.
2) У провайдера мастера попробуй поставить poFetchDetailsOnDemand.
3) В детальном датасете все-таки лучше используй запроc вида SELECT ... WHERE kl_id=:kl_id, соответствующему CDS-у на клиенте сделай Fetch params и заполняй значение параметра на клиенте руками по мере надобности.
Пока все.
Sergey13 (2003-08-19 10:46:00) [4]
2sargos © (19.08.03 03:22)
>а вот для деталь таблицы :(
select * from comment //Зачем это? Клиенту полностью грузится таблица примечаний!
И она не используется!
А лукапные поля есть? Если есть, то из-за них.
>c_id smallint(3) Нет primary key, auto_increment
Не маловато число для ключа. Если в БД максимум 999 записей то и трафика особого не предвидится.