|
|
|
Клиент-серверная архитектура баз данных. Проблемы перехода и оптимизации
|
|||
|---|---|---|---|
|
#18+
Почитал вот это http://forum.sources.ru/index.php?showtopic=75714 (Переходим на клиент-сервер (советы)) Но осталось много вопросов. Сразу скажу, что это применительно к связке MS SQL Server + C++Builder + ADO. Плюс это применительно для работы через Интернет. В локали все работает нормально и так. 1) Допустим есть таблица с заказами. Пользователь может осуществлять поиск, фильтрацию или просматривать в табличном виде записи, которые могут в зависимости от состояния заказа быть помечены другим цветом и т.п. Т.е. работа с таблицей посредством лишь запроса к конкретной записи невозможна. Как все же оптимизировать и ускорить работу? У меня Grid и пользователь по нему "гуляет". Как оптимизировать так, чтобы подгружались только выводимые на экран записи? Или раз выполнился запрос - будьте любезны подкачать X байт данных со всеми результатами? Т.е. для оптимизации потребуется писать свой грид на основе TListView допустим. Т.е. делать сначала запрос с SELECT ID... а потом при отображении грида будем уже для ID видных на экране подгружать запись целиком. Т.е. перемещаясь у нас одна за одной записи будут подгружаться. Обратно вверх идем - все уже загружено и ничего грузиться не будет. Или может другие способы есть? Пример второй - есть таблица запчастей. Скажем 10000 записей. Инвентаризационный запрос с группировкой вернет нам, скажем, 1500 наименований. Это занимает приличный объем и никакие средства и архитектуры не помогут сократить траффик и скорость генерации отчета. Я правильно понимаю? Т.е. если особенность работы с данными такова, что не всегда возможна организация работы с единичной записью, то мы теряем все преимущества клиент-серверной архитектуры и у нас будет постоянно большой поток данных. Даже если в выборке записей 100. Я прав? Как тогда быть? Ограничить при работе через Интернет работу с заказами только через поиск? Ну а если у нас идет ремонт заказа и надо на складе найти нужную запчасть, а их у нас 1000 наименований. И пользователь не всегда сможет составить грамотный запрос, чтобы у него было мало записей. Он введет "Samsung" и все запчасти этой марки попадут в список. Или допустим хозяин мастерской хочет посмотреть "зависшие заказы" на удаленной точке. Их может быть и много. Он выбрал фильтрацию по таким заказам и получил табличку в 100 записей (из 10000). Там приличный траффик будет. Как быть? 2) Есть таблица-справочник. Она пополняемая. Т.е. если после какой-то операции видно, что пользователь указал новые данные, то таблица пополняется. Как рациональней - грузить изначально всю таблицу все-таки в TADOTable, который потом после Insert'а на сервер новую запись скинет, или же постоянно пользоваться для организации выбора из справочника запросами? Тут поясню - помимо основного приложения, есть дополнительная программка, которая обменивается командами между сервером и клиентами. Т.е. я подумал - для чего мне при организации меню пользователя каждый раз делать Query, я лучше подгружу Table, а если добавлю записи, то пошлю серверку команду, а тот уже объявит клиентам другим, что таблича со справочником пополнилась и они ее обновят. Мне кажется запросов при такой организации куда меньше (т.е. если данные не добавлялись, то при организации меню будет всего один запрос - при старте программы). Или может посоветуете что-то оптимальней со справочником? 3) Есть таблица. Часть данных видны пользователю, часть служебная информация. При работе с записью нужны все поля (много). Для отображения в гриде - только часть (десяток). Что выгоднее - использовать один QUERY * и использовать его и для отображения таблицы и для работы с записью, или же для отображения таблицы использовать один запрос (только с нужными данными в SELECT'е), а потом после того, как пользователь выбрал какую-то запись, то делать еще один запрос "SELECT * WHERE ID=..."? Понятно, что во втором случае траффик снизится, но что будет с производительностью? Каждый раз перемещаясь по записи будет новый запрос на выборку всех оставшихся данных... 4) Я правильно понял, что TADOTable равносилен запросу SELECT *? 5) Есть ли какие-нибудь ключи ConnectionString или особенности использования TADOTable, TADOQuery, TDataSource и TBDGrid, которые бы помогли хоть немного снизить нагрузку на Интернет-канал? Или все в руках того, кто выстраивает систему запросов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2008, 21:42 |
|
||
|
Клиент-серверная архитектура баз данных. Проблемы перехода и оптимизации
|
|||
|---|---|---|---|
|
#18+
1) Вам по-любому нужно будет передавать на клиента все данные, которые необходимы пользователю. Можно загрузить кучу данных в датасет, и затем в зависимости от того, что пользователь указал в полях поиска на форме, заниматься фильтрацией данных в датасете. Можно каждый раз передавать запрос на сервер (или вызывать хранимые процедуры), после того, как пользователь ввел какие-то данные в поля поиска формы. Таким образом мы передаем информацию на клиента небольшими порциями. Лично я использую второй вариант (только запросами без использования фильтрации). Не знаю насколько это правильно - просто мне так удобнее и привычнее. С траффиком никаких проблем не испытываю. Использую в основном ADODataSet и ADOCommand. Они более функциональные, чем ADOQuery, или ADOTable. 3) По третьему вопросу: здесь тоже все делаю несколькими запросами. Есть грид. Загружаю данные (первый запрос). Пользователь может перемещаться по строкам грида. Ничего не делаю. Если пользователь дважды кликнул по строке грида или выбрал из контекстного меню команду "Редактировать", то считываю из грида id, выполняю запрос на выборку данных, открываю форму уже со всеми полями для редактирования данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2008, 13:53 |
|
||
|
Клиент-серверная архитектура баз данных. Проблемы перехода и оптимизации
|
|||
|---|---|---|---|
|
#18+
1) Вот насчет траффика. >> Есть грид. Загружаю данные (первый запрос). Вот какой объем таблицы получается? Сколько записей и полей? Чем ADODataSet и ADOCommand предпочтительнее? >> пользователь ввел какие-то данные в поля поиска формы У вас поиск после нажатия кнопки или динамический в процессе ввода? Т.е. набрал в поле ФИО букву "И" и все заказы у меня с ФИО начинающиеся на букву И. Набрали "Ив" - и список сократился до Ивановых, Ивашкиных и т.д. Так функциональней, но думаю при работе через Интернет на каждый "чих" пользователя делать запрос и грузить данные накладно, тем более что как в примере на букву И может быть сотня записей с заказами. 3) Ну так вот и планирую переделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2008, 18:40 |
|
||
|
Клиент-серверная архитектура баз данных. Проблемы перехода и оптимизации
|
|||
|---|---|---|---|
|
#18+
Adalon Т.е. набрал в поле ФИО букву "И" и все заказы у меня с ФИО начинающиеся на букву И. Набрали "Ив" - и список сократился до Ивановых, Ивашкиных и т.д. Так функциональней, но думаю при работе через Интернет на каждый "чих" пользователя делать запрос и грузить данные накладно, тем более что как в примере на букву И может быть сотня записей с заказами. Ты делай как Яндекс, он же не загружает на одну страницу все результаты поиска. Показал первые 20 записей, если юзер тыктнул кнопку "2" - загрузил из БД следующие 20 записей и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2008, 20:30 |
|
||
|
Клиент-серверная архитектура баз данных. Проблемы перехода и оптимизации
|
|||
|---|---|---|---|
|
#18+
Adalon1) Вот насчет траффика. >> Есть грид. Загружаю данные (первый запрос). Вот какой объем таблицы получается? Сколько записей и полей? В грид, естественно, гружу не все данные. Записей - бывает приличное количество. Поля - только самые необходимые для того, чтобы пользователь смог сориентироваться в информации. Их, как правило, немного. Если вас напрягает объем выводимых данных, то на форме можно добавить поле, где пользователь будет указывать количество выводимых записей. Указал 30 записей - покажем ему только первые 30 записей. Особенно это распространено в приложениях с Web-интерфейсом. Adalon Чем ADODataSet и ADOCommand предпочтительнее? А вы их попробуйте. :) Adalon>> пользователь ввел какие-то данные в поля поиска формы У вас поиск после нажатия кнопки или динамический в процессе ввода? По нажатию на кнопке. Часто бывает, что на форме несколько полей для поиска, т.е. пользователь может задавать несколько параметров. В данном случае редко имеет смысл выполнять запрос, если пользователь ввел условия для поиска только в первое поле, а в другие еще не успел. Adalon Так функциональней, но думаю при работе через Интернет на каждый "чих" пользователя делать запрос и грузить данные накладно ... Как-то заюзал SugarCRM (Web-интерфейс, Web-сервер Apache, PHP, СУБД MS SQL Server 2005). Запустил приложение, запустил профайлер. Знаете сколько запросов выполняется на каждый "чих"? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2008, 07:35 |
|
||
|
Клиент-серверная архитектура баз данных. Проблемы перехода и оптимизации
|
|||
|---|---|---|---|
|
#18+
2 Goffman Ты делай как Яндекс, он же не загружает на одну страницу все результаты поиска. Показал первые 20 записей, если юзер тыктнул кнопку "2" - загрузил из БД следующие 20 записей и т.д. Тоже верно. Т.е. ввести страницы по X записей и дергать потом в запросе записи в зависимости от номера страницы. 2 edges7 А вы их попробуйте. :) Можно и позаменять, конечно, но вы расскажите в чем же преимущество? Как-то заюзал SugarCRM (Web-интерфейс, Web-сервер Apache, PHP, СУБД MS SQL Server 2005). Запустил приложение, запустил профайлер. Знаете сколько запросов выполняется на каждый "чих"? :) Количество не важно - сервер переварит. Важен объем данных. Чтобы траффика не очень много кушалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2008, 13:14 |
|
||
|
Клиент-серверная архитектура баз данных. Проблемы перехода и оптимизации
|
|||
|---|---|---|---|
|
#18+
Adalon 2 edges7 А вы их попробуйте. :) Можно и позаменять, конечно, но вы расскажите в чем же преимущество? Во-первых, я вроде бы уже упоминал о большей функциональности данных компонент. Например, тот же ADODataSet может с большим успехом заменить и ADOTable, и ADOStoredProc, и ADOQuery. Правда, в последнем случае он выполняет только команды, которые возвращают набор данных ( т.е. запросы типа select ). Для остального применяется ADOCommand. Во-вторых, как я полагаю, ADODataSet и ADOCommand являются более "родными" объектами ADO, чем тот же ADOTable или ADOQuery, которые достались "по наследству" от BDE. В-третьих, полистайте лучше какие-нибудь хорошие руководства по данной тематике. Там вы все равно найдете больше информации, чем если бы об этом рассказывал я. :) AdalonКоличество не важно - сервер переварит. Важен объем данных. Чтобы траффика не очень много кушалось. Если вы "рисуете" Web-интерфейс, то есть следующие варианты: 1) Отображаете на страничке не все записи, а скажем, только первые 20. Если пользователю нужно больше данных, то он жмет соответствующую кнопку, вы загружаете следующие 20 записей, обновляя данные на странице. И т.д. 2) Можно расширить функциональность, дав пользователю возможность указывать количество отображаемых записей на странице. А для того, чтобы здесь не было беспредела, можно ограничить их количество, например, до 100. И пусть себе пользователь тихо и мирно сосуществует в диапазоне от 1 до 100. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 08:11 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35263395&tid=1543913]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
173ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
39ms |
get tp. blocked users: |
2ms |
| others: | 258ms |
| total: | 514ms |

| 0 / 0 |
