Текущий архив: 2003.09.11;
Скачать: CL | DM;
Вниз
Как избежать лишний трафик? Найти похожие ветки
← →
sargos (2003-08-19 03:22) [0]Как избежать лишний трафик?
Уважаемые знатоки, что вы можете посоветовать в такой ситуации:
Среда: 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")
- запрос выполняется два раза, что уже лучше, но почему два раза?
Может быть я что-то не так делаю?
Подскажите пожалуйста что мне делать в данной ситуации.
Заранее благодарен.
← →
Sergey13 (2003-08-19 10:46) [1]2sargos © (19.08.03 03:22)
>а вот для деталь таблицы :(
select * from comment //Зачем это? Клиенту полностью грузится таблица примечаний!
И она не используется!
А лукапные поля есть? Если есть, то из-за них.
>c_id smallint(3) Нет primary key, auto_increment
Не маловато число для ключа. Если в БД максимум 999 записей то и трафика особого не предвидится.
← →
Nikolay M. (2003-08-19 10:47) [2]1) Рекомендую вместо dbexpress поставить библиотеку прямого доступа к мускулу ZeosLib.
2) У провайдера мастера попробуй поставить poFetchDetailsOnDemand.
3) В детальном датасете все-таки лучше используй запроc вида SELECT ... WHERE kl_id=:kl_id, соответствующему CDS-у на клиенте сделай Fetch params и заполняй значение параметра на клиенте руками по мере надобности.
Пока все.
← →
sargos (2003-08-20 04:29) [3]>А лукапные поля есть? Если есть, то из-за них.
Нет, таких полей нет.
>Не маловато число для ключа. Если в БД максимум 999 записей то и трафика особого не предвидится.
В таблице констант будет присутствовать максимум 150-200 записей,
но дело не в этом, еще ряд таблиц в отношениях Мастер-Деталь с таблицей примечаний её используют
za_id mediumint(8) Нет index //поле связи c таблицей zayavka "заявка"
или тут можно что-то улучшить?
← →
sargos (2003-08-20 04:31) [4]>1) Рекомендую вместо dbexpress поставить библиотеку прямого доступа к мускулу ZeosLib.
Установил ZeosDBO, выполнил ваши рекомендации, теперь порядок.
Большое спасибо!
Страницы: 1 вся ветка
Текущий архив: 2003.09.11;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.008 c