|
куча вопрсов
|
|||
---|---|---|---|
#18+
База сетевая, т.е. лежит на удаленной машине. Если мне нужна одна запись, то все равно вся таблица при запросе прется на локальную машину. А при добавлении одной записи происходит то же самое? По моему так.Если я делаю добавление записи через Add рекордсета, то сначала мне нужно открыть новый рекордсет, т.е. у меня уже один открыт (источник формы) и я еще открываю один. Т.е. че получается, еще один экземпляр таблицы прется на локальную машину? Итого два. А если я это делаю INSERTом через Execute то, по-моему такого не происходит. Плиз, правильно ли я все понимаю? Не могли бы мне более конкретно объяснить механизм добавления и удаления записей. С выборкой все понятно. По любому таблица вся передается клиенту. А вот с остальным не могу врубиться! Да и еще, если я делаю RecordsetClone, то не могу в него добавлять записи, даже если в свойствах формы запрещаю блокировки. Ругается, говорит, что типа запись заблокирована. Да, и еще такой вопрос. Если источником формы является сохраненный запрос, то, что происходит в этом случае при открытии таблицы? Клиенту отправляется только выборка, возвращаемая таким запросом? Или опять вся таблица? А когда происходят изменения в таблице, на основе которой создан запрос, то, что сохраненный запрос начинает обновляться в базе? Если нет то тогда же в чем смысл сохраненного запроса, если он все равно выполняется при обращении к нему? А сохраненные параметрические запросы? С ними как дела обстоят? Короче, я тут вообще запутался окончательно. Выручайте! Когда базки делал локальные просто об этом не задумывался, а теперь каждый нюанс становится важным. На машинах, где будет работать база очень медленная связь с основной сетью (модем). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2002, 00:12 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
Помоемы тебе надо почитать по базам данных книженцию-другую :) Для рекорд сета есть такая вещь как курсор. Обычно он встает на первую запись. Когда ты делаешь MoveNext он вытягивает следующую! Но, конечно не все так просто... По хорошему во многих API нет MoveLast, это каким-то образом завязано с тем, что не надо тянуть всю базу. А в Access такой метод есть. Из этих соображения я делаю вывод, что Access действительно вытягивает вся записи по результату запроса, ну соответственно все записи таблицы... При этом соответственно можно делать запросы, которые будут вытягивать только необходимы записи из таблиц! А кто работает на связке Access+MSSQL ? Вы ж точно хнаете сколько данных передается с сервера на клиента?! Статистика-то у Вас есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2002, 09:32 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
>>А кто работает на связке Access+MSSQL ? У ADO.Recordset есть свойство CursorType со значениями adUseClient и adUseServer. В первом случае курсор создаётся на клиенте, заполняется записями из запроса/таблицы, после чего открывается на первой. Ходи-не ходи по нему, записи все уже здесь. Во втором случае курсор создается на сервере, клиент открывает Recordset ПУСТОЙ, и по мере хождения по нему с сервера фетчатся нужные записи. А теперь вопрос: при медленном соединении какой вариант будет быстрее??? Есть над чем подумать, не так ли? Однако если речь о форме access, она работает ТОЛЬКО на adUseClient Recordsete. Т.е. перед открытием формы на клиента приходят все* записи, возвращаемые подлежащим запросом/таблицей. Отсюда вывод - если соединение медленное, юзайте параметрические запросы. *Одно но. У формы есть свойство MaxRecords (Максимальное число записей на вкладке Данные). Оно ограничивает максимальное кол-во записей, получаемых формой от провайдера. Как и в каком конкретном случае (ADO-DAO, SQLServer-MDB) это свойство работает, я не знаю, надо эксперименты ставить, на которые нету времени :-( ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2002, 11:40 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
>>Если источником формы является сохраненный запрос, то, что происходит в этом случае при открытии таблицы?\r >>Клиенту отправляется только выборка, возвращаемая таким запросом?\r Если таблица на SQLServere - то приходит только выборка.\r При этом используется сохраненный запрос или строчка "SELECT ..." в свойстве Recordsourсe - здесь значения не имеет. \r Если таблица в mdb-файле, то здесь понятия "клиент", "выборка приходит" не применимы, т.к. вся работа с mdb-файлом происходит на уровне операций файлового ввода-вывода, а не на уровне таблиц и строк, в т.ч. и тогда, когда mdb-файл, содержащий таблицы, лежит в папке удаленного компьютера. А там совсем другие принципы. Есть, например, дисковый кэш ...\r \r >>А когда происходят изменения в таблице, на основе которой создан запрос, то, что сохраненный запрос начинает обновляться в базе?\r \r Вопрос не понял.\r \r >>Если нет то тогда же в чем смысл сохраненного запроса, если он все равно выполняется при обращении к нему?\r Смысл сохраненного запроса в отличие от несохраненного в том, что первый парсится один раз - при сохранении, второй - при каждом вызове. Здесь я писал об этом.\r Аналог сохраненного запроса Access в мире SQL-серверов - это хранимые процедуры и view. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2002, 12:38 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
4 mahoune очень заинтересовали фразы >Когда ты делаешь MoveNext он вытягивает следующую! может он вытягивает все записи на клиент сразу, а Move просто по ним бегает? и еще вот эта >При этом соответственно можно делать запросы, которые будут вытягивать только необходимые записи из таблиц! дайте книжку почитать! 4 Роман Ткачук я имею представление, что такое серверные и клиентские курсоры в связке ADO+SQLServer и, что в акцессе существуют только клиентские. Но в данный момент речь идет об одном акцессе 97. Я не пойму одной вещи. Вы хотите сказать, что если я делаю параметрический запрос, то он выполняется на удаленной машине, где лежит база, а клиенту передается только результат запроса????? Это как? Это же не SQLServer! Это же просто обычный файл. А разве не вся таблица передается клиенту и не на клиенте ли выполняется этот запрос? Вы же сами пишите >Если таблица в mdb-файле, то здесь понятия "клиент", "выборка приходит" не применимы, т.к. вся работа с mdb-файлом происходит на уровне операций файлового ввода-вывода, а не на уровне таблиц и строк, в т.ч. и тогда, когда mdb-файл, содержащий таблицы, лежит в папке удаленного компьютера. А там совсем другие принципы. Есть, например, дисковый кэш ... >Аналог сохраненного запроса Access в мире SQL-серверов - это хранимые процедуры и view. на SQLServer результат вьюхи формируется на сервере, а потом отправляется клиенту. Где же аналогия? В том что SQL- запрос хранится в базе уже в разобранном виде? Если я ничего не понимаю, почему тогда время выполнения двух запросов, один из которых выбирает одну запись по проиндексированному полю из одной несвязанной таблицы с 50000 записями (SELECT * FROM Table1 WHERE ID=1) и запрос, который выбирает все записи из той же таблицы при скорости соединения 56K выполняются приблизительно одинаковое время? Cчет идет на десятки секунд, потому разница 2-3 секунды не существенна и можно сказать, что время выполнения одинаково. Не потому ли что вся таблица, будь то параметрический запрос к ней или нет все равно прется на клиент (здесь клиентом я называю машину которая работает со связанными таблицами mdb-файла, который лежит на удаленной машине, 4 Роман Ткачук: я и не имел ввиду что это то же самое, что и в контексте SQLServer)? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2002, 19:22 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
2 Smile У меня создается стойкое впечатление, что мы с вами говорим на разных языках... Я ответил на все ваши вопросы выше, а вы снова их задаёте... Я отвечу вам цитатами из предыдущих своих писем. Не могу же я снова набирать один и тот же текст. >>Вы хотите сказать, что если я делаю параметрический запрос, то он выполняется на удаленной машине, где лежит база, а клиенту передается только результат запроса????? Если таблица на SQLServere - то приходит только выборка. Если таблица в mdb-файле, то здесь понятия "клиент", "выборка приходит" не применимы, т.к. вся работа с mdb-файлом происходит на уровне операций файлового ввода-вывода >>А разве не вся таблица передается клиенту и не на клиенте ли выполняется этот запрос? ... вся работа с mdb-файлом происходит на уровне операций файлового ввода-вывода, а не на уровне таблиц и строк, в т.ч. и тогда, когда mdb-файл, содержащий таблицы, лежит в папке удаленного компьютера. А там совсем другие принципы. Есть, например, дисковый кэш ... >>на SQLServer результат вьюхи формируется на сервере, а потом отправляется клиенту. Где же аналогия? В том что SQL- запрос хранится в базе уже в разобранном виде? Ну, тут вы сами себе дали ответ. >>Если я ничего не понимаю, почему тогда время выполнения двух запросов, один из которых выбирает одну запись по проиндексированному полю из одной несвязанной таблицы с 50000 записями (SELECT * FROM Table1 WHERE ID=1) и запрос, который выбирает все записи из той же таблицы при скорости соединения 56K выполняются приблизительно одинаковое время? ... вся работа с mdb-файлом происходит на уровне операций файлового ввода-вывода, а не на уровне таблиц и строк, в т.ч. и тогда, когда mdb-файл, содержащий таблицы, лежит в папке удаленного компьютера. А там совсем другие принципы. Есть, например, дисковый кэш ... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2002, 09:37 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
Хорошо, попытаюсь другими словами, сорри если не совсем поятно выражаю суть вопроса. Господа хорошие, не сочтите за труд, русским языком мне объяснить, что происходит когда я делаю запрос SELECT * FROM MyTable WHERE ID=1. Я затрудняюсь понять файловый ввод-вывод в отношении работы с mdb-файлом. Файловый ввод-вывод разный бывает, можно по байту читать, а можно и блоками, и писать в файл также. И скорость выполнения таких операций будет различаться. Акцесс работает с блоками (или как правильно, страницами данных), черт с ним если он не оперирует таблицами. Как теоретически выяснить размер передаваемых при запросе на машину, с которой выполняется этот запрос (уж и боюсь такую машину назвать клиентом)? ~ Длинна записи Х на количество записей в выборке или ~длинна записи Х колчиство записей в таблице(странице, блоке страниц или чем он там оперирует)?. Или, по-другому, он каким-то образом считывает только необходимые блоки и отправляеи его на машину, с которой делается запрос? Или, совсем другими словами, размер данных (раз, блин, нельзя тут говорить про таблицы), передаваемый на машину, которая выолняет запросы SELECT * FROM MyTable WHERE ID=1 и SELECT * FROM MyTable один и тот же или нет? Можете мне на пальцах объяснить? Судя повсему=), вопрос для всех очень простой, раз почти никто на него не отвечает. Не все же такие професионалы, кто-то и такие вопросы должен задавать. И еще, при открыти вторго рекордсета с одной и той же таблицы, акцесс проделывает все тоже самое, что и при открытии первого или же он достаточно умен, что б использовать для этого уже открытый первый рекордсет и открывает второй на основе первого? И, плиз, не надо мне объяснять, как все это работает в SQL Server! Если б я этого не знал, я бы задал вопрос в соседний форум! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2002, 23:17 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
Клиент -> Запрос SQL -> Передача на сервер (Сеть, Модем, Ядро) -> Сервер -> Обработка Запроса SQL -> Обращение к БД (Сеть, Модем, Локальный диск) -> Отбор записей по фильтру -> Сортировка записей -> Предача на Клиента (Сеть, Модем, Ядро) -> Вывод результата Наверное я нарисовал саму общую структуру работы клиента с БД. И не важно работаешь ты с mdb или с SQL Server. Так вот, что касательно объемов данных, то на месте "Передача на сервер (Сеть, Модем, Ядро)" передается весь текст запроса! На моменте "Обращение к БД (Сеть, Модем, Локальный диск)" стало ясно какие таблицы учавствуют в запросе и извлекая индексы частично отбросили записи не учавствующие в запросе. Тут "Отбор записей по фильтру" идет окончательный разбор записей и возвращаются только необходимые. "Предача на Клиента (Сеть, Модем, Ядро)" на этом моменте клиенту послается только информация что его запрос выполнен и данные готовы к передаче! Самая большая объем передаваемых данных на этом моменте "Обращение к БД (Сеть, Модем, Локальный диск)" затем "Предача на Клиента (Сеть, Модем, Ядро)". Эта схема тебе может показаться подходящей только под SQL Server но с файлом mdb происходит тоже самое! Просто передача данных происходит внутри ядра и в качестве сервера выступает просто програма, а точнее один из модулей Access. Так вот в любом варианте! Сервер БД передает по одной записи, а то что модуль Access запрашивает сразу весь результат это сам Access так запрограммирован! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2002, 10:03 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
> или же он достаточно умен, что б использовать для > этого уже открытый первый рекордсет и открывает > второй на основе первого? Вот тут ИМХО умничанья как раз не надо. Если нужно открыть рекордсет на основе другого, используй RecordsetClone А Access как раз не должен ничего лишнего проверять. Мало ли какие опции ты задашь... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2002, 10:23 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
4 mahoune Простите, плиз, за наглость, но я вам задам все-таки еще один вопрос: записи не попавшие в результат выборки отбрасываются на машине, где лежит mdb или отбрасываются на запрашивающей машине (и после обработки на запрашивающей машине попадают в рекордсет)? Просто, скажите, 1-е или 2-е ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2002, 11:10 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
Однимс словом ответ 2! Машина на которой у тебя лежит mdb файл это не сервер, а просто место храниения БД. А сервер у тебя в данном случае расположен на локальной машине. Из чего следует что ВСЕ данные передаются по сети из их места расположения на клиента, а тот их уже фильтрует! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2002, 11:25 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
По опыту работы с .mdb и SQL могу описать различия. Access - при открытии ленточной формы - все данные клиенту. Он осуществляет все. При начале редактирования записи - блокируетя запись, а то и страница - если на основе запроса. Быстрый рекордсет, даже если он dynaset. SQL - при открытии ленточной формы - клиенту только ключи, потом данные только на те записи, которые в данный момент на экране, да и то ключи Access берет не сразу все.(Его потом нужно подтолкнуть, чтобы выбрал все и снял блокировку). Блокировка обновления - только при переходе на другую запись или "сохранить запись". Медленные рекордсеты - если надо много записей через них или Find, то лучше их не использовать. Зато примение фильтров - в лет. Вообще, у них столько отличий, что лучше сказать что у них обшего - оба хранят данные ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2002, 12:26 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
4 mahoune гора с плеч спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2002, 10:25 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
4 mahoune Ну, блин, я не виноват, еще один вопрос возник, замучал я вас наверное если >Из чего следует что ВСЕ данные передаются по сети из их места расположения на клиента, а тот их уже фильтрует! не означает ли это в применении к файловому вводу-выводу, что вообще при обращении к любой таблице прется не часть mdb-файла (таблица указанная в запросе), а весь mdb-файл. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2002, 02:08 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
Ну все зависит от того как запрограммировано! Но скорее всего конечно передается часть mdb файла отвечающего за описание таблицы, а потом уже и таблица следом! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2002, 10:15 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
4 mahoune А тогда, как именно можно запрограммировать? Ведь чтобы что-то считать из файла, нужно его открыть, а файл вроде как бы кусками не может открываться ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2002, 00:35 |
|
куча вопрсов
|
|||
---|---|---|---|
#18+
Ну запрограммировано не тобой а разработчиками access. А вот файл ты просто открываешь, а потом читать можешь с любого места, тока это всеравно не в тему, мы не файлы открываем, а с БД работаем. А она сама должна ришать как открыть!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2002, 10:12 |
|
|
start [/forum/topic.php?fid=45&msg=32065272&tid=1682968]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
138ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 318ms |
total: | 563ms |
0 / 0 |