|
|
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
Понимаю, что проблема стандартная, но найти решение не получается. Есть БД на SQL Server-2000. К ней два типа клиентов (оба - Акцесс-2000, формат mdb). Один - на ввод данных, второй - на поиск, выборки, просмотр и т.п. Проблема такая: если кто-то начинает заниматься выборками, то ввод сразу подвисает. И выборки сразу же перестают делаться. Получается стандартная ситуация: "белый человек, смотрящий сквозь прозрачное стекло на песочные часы". Что делать-то? И где искать решение - на сервере или клиенте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 13:39 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
1. Нафиг отказать от mdb и перейти на adp или активней использовать запросы к серверу 2. что-то еще == а индексы есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 13:45 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
1. Прямо по больному месту получил!:) Ситуация дурацкая: пока нет 100%-ой вероятности, что основой останется именно SQL-Server. Возможен переход на Оракл. Мало того, клиенты в ряде случаев и с Акцессной базой работают! Бред, одним словом. Но от mdb в ближайшем будущем отказаться не имею права. Поэтому приходится искать решение именно в этом формате. 2. Индексов нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 13:49 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
2. Ужасно плохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 13:52 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
Но от mdb в ближайшем будущем отказаться не имею права Тогда остается только запросы к серверу (таким образом перенесешь логику работы на сервер) и ОБЯЗАТЕЛЬНО создание индексов - ты Профайлером посмотри - у тебя скорей всего при запросе 1 записи из мульона - сканиться вся таблица и все из-за отсуствия индексов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 13:58 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
С запросами суть такая. Текст запроса конструируется в VBA на основе заданных пользователями критериев. Потом этот запрос присваивается форме в качестве источника данных. Т.е. сохраненные запросы не используются. Интересно, а можно из VBA создать запрос к серверу? Так, чтобы форма потом его в качестве источника приняла.... В Профайлер смотрел. Там запрос выглядит самым банальным образом. Например: SELECT трам, пам, пам FROM тым-пым-пым WHERE дым-дым-дым ORDER BY ля-ля-ля; (WHERE конструируется по ходу из пользовательских критериев). А записей, действительно, может быть много. Но не мульен! 15 тыс. максимум! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 14:11 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
надо смотреть что именно тормозит. если тормозят запросы на сервере то хоть через что подключайся тормоза останутся первым делом сделай нужные индексы если совсем ничего не понимаешь в этом запусти энтерпрайз менеджер и запусти индекс тюнинг визард определить что именно тормозит твой сервер поможет профайлер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 14:16 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
Имхо. авторИнтересно, а можно из VBA создать запрос к серверу? Так, чтобы форма потом его в качестве источника приняла.... Это не обязательно. Вполне можно обойтись строкой, которая сформирована из VBA. Вот только индексы по полям, по которым пользователи делают выборку нужны. Еще раз имхо. А еще нужно ограничить кол-во записей. Я не поверю, что пользователь может эффективно работать с формой, к которой более 1000 записей. Я не о быстродействии, а об удобстве работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 14:18 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
а еще и в том числе из MDB можно создать ADO рекордсет, и не использовать ни запросы к серверу ни линкованные таблицы, при этом провадер такойже как и adp - SQLOLEDB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 14:24 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
авторЯ не поверю, что пользователь может эффективно работать с формой, к которой более 1000 записей вполне может, если умеет эффективно использовать сортировку и фильтры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 14:26 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
авторвполне может, если умеет эффективно использовать сортировку и фильтры Так и я о том же. Зачем задавать два параметра, тянуть с сервера 20 000 записей, чтобы потом сделать фильтр еще по двум параметрам и получить 100 записей. Почему нельзя сразу задать 3 параметра и получить 100 записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 14:32 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
Насчет 1000 записей. Пользователи трудновразумляемые. Да и задачи поиска не всегда алгоритмизуемые. Иногда приходится задавать очень общий поиск, посмотреть сколько записей вылезет, потом чесать репу и думать как его уточнить. А иногда сидеть и тупо перебирать 1000 записей в попытке найти свое счастье:)) Дополнительная проблема в том, что несколько полей имеют тип MEMO (т.е. ntext(16)). А с ним вообще тяжело жить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 14:36 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
автор Пользователи трудновразумляемые. На каждую хитрую ж@#$ есть хр#$ с винтом Это я к тому что любого пользователя можно вразумить, нужны только разные подходы. У меня тоже часто встречались варианты: "Хочу так и никак иначе." На что я отвечал - если сможешь аргументированно доказать для чего нужно я сделаю. А иначе - это не предметный разговор, а поток эмоций. авторДополнительная проблема в том, что несколько полей имеют тип MEMO (т.е. ntext(16)). А с ним вообще тяжело жить. А вот это совсем плохо. Имхо - все-таки нужно искать другой подход в реализации. Тут больше проблема не техническая, а методологическая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 14:50 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
автор Дополнительная проблема в том, что несколько полей имеют тип MEMO (т.е. ntext(16)). А с ним вообще тяжело жить. не правда ваша, очень все хорошо и легко. на этот случай у MSSQL есть полнотекстовый поиск авторПочему нельзя сразу задать 3 параметра и получить 100 записей. потому что бывают такие ситуации что эти 3 параметра нужно сначала найти в этих нескольких десятках тысяч записей.. разумеется если есть возможность определить изначальные критерии то лучше их вынести в элементы управления задающие источник данных фрмы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 15:07 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
авторне правда ваша, очень все хорошо и легко. на этот случай у MSSQL есть полнотекстовый поиск Это конечно штука хорошая. А как он с клиента работает? Да еще и с MDB. авторпотому что бывают такие ситуации что эти 3 параметра нужно сначала найти в этих нескольких десятках тысяч записей.. Имхо. Может и бывают, но это означает только то, что опять хромает методология учета и построения учетной системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 15:40 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
Во-первых, огромное спасибо всем принявшим участие в обсуждении! Масса тем для размышления, хотя так и не принял решение куда двигаться. Но вот о чем я думаю: откуда вообще берется в данной ситуации блокировка? Оператор вводит новую запись, т.е. теоретически вообще не трогает введенные ранее записи. "Просматриватель" ковыряется со старыми, не имея возможности ничего изменить и не имея доступа к новой записи. Так чего же сервер все блокирует? И почему сразу обоим? И почему так надолго? Запрос ведь выполняется буквально 1-2 секунды. И еще. Может быть, существует вариант, чтобы "просматриватель" в форме работал со статическим набором записей? Т.е. запросил сервер и ковыряешься в том, что нашел. А новые данные получаешь только по следующему запросу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 15:45 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
timestamp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 15:57 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
Хотелось бы отдать полный приоритет вводильщикам. Просматривальщикам совсем не надо оперативно получать свежие данные. Лишь бы все не блокировалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 16:29 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
Временные таблицы для просмотрщиков. Вся логика на клиенте. Если будете переходить на Оракл+Аксесс - то минимум изменений, т.к. и там и там через ODBC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 16:41 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
авторполнотекстовый поиск Это конечно штука хорошая. А как он с клиента работает? Да еще и с MDB. а какие проблемы ??? адо запрос , внутри хранимки с параметрами или в представлении. вот пример из BOL SELECT title, notes FROM titles WHERE CONTAINS ( notes, ' "favorite recipes" OR "gourmet recipes" ' ) Full-text search uses the new Transact-SQL predicates (CONTAINS, CONTAINSTABLE, FREETEXT, and FREETEXTTABLE) to query these populated full-text catalogs авторНо вот о чем я думаю: откуда вообще берется в данной ситуации блокировка? а с чего ты взял что блокировка?, может просто неотимальный запрос чрезмерно грузит сервак авторИ еще. Может быть, существует вариант, чтобы "просматриватель" в форме работал со статическим набором записей? Т.е. запросил сервер и ковыряешься в том, что нашел. А новые данные получаешь только по следующему запросу можно и с динамическим ... создай адо рекордсет, подключи его к серверу и назначь его форме рекордсетом Код: plaintext 1. 2. 3. 4. 5. 6. 7. <параметр> замени на свои вместе с <> кстати у формы есть свойство «Тип набора записей» (RecordsetType) его можно сделать статическим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 16:53 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
Тема вряд ли может быть покрыта за один присест - не та овца. Судя по всему, начать придется с магазина - закупай горох. Для начала вопросы - 1) как достукиваешься до сервера - через линкованные таблицы? 2) что-то не совсем понятно, про то, что индексов нет - что и PK тоже нет? как же тогда происходит добавление записей? 3) как отдаешь Источник проблем может лежать как на стороне mdb, так и на стороне сервера. На стороне мдб 1) линкованные таблицы - тут влегкую можно сервер заблокировать, ежели открывать одновременно несколько запросов, да еще одновременно выполнять "транзакции" на них. Грубо - причина в том, что количеством соединений к серверу и порядком обращения к данным кишки (Jet) управляет, не спрашивая голову (разработчика). В этом случае типично возможны железные объятия даже просто "при просмотрах". 2) под наборы типа КейСет аксесс открывает глобальные серверные курсоры, что само по себе может просадить слабенький сервачек практически до нуля, при "больших" объемах выборки и множестве соединений. На стороне сервера. При запросе на выборку данных, если этот процесс специально не управляется, сервер расставляет блокировки на время выборки на отбираемые страницы данных (записи). У него есть привычка (особенность, возможность) следующего содержания: если он считает, что отбираться будет "большая часть таблицы", то может заменить стратегию блокировки читаемой записи (страницы) на полную блокировку таблицы. Как он приходит к такому выводу - его дело. Имей ввиду, что блокировка в таком случае (если совсем не заврался) не снимется пока пользователь не закроет любимую форму в мдб (или не сменит источник), то есть пока не освободит глобальный курсор. В общем с магазина начинай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 17:05 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
To Темный: ... временные таблицы... Т.е. с какой-то частотой перекачивать все данные на клиента и там уже делать выборки в свое удовольствие? Что-то во мне противится такому варианта, хотя объяснить не готов. Может, я неправильно понял? To АлексейК: насчет ADO буду экспериментировать, т.к. ранее почти не пользовался. кстати у формы есть свойство «Тип набора записей» (RecordsetType) его можно сделать статическим" Не помогает. На сервер приходит обычный запрос, который в свое удовольствие блокирует все на фиг. Неоптимальный запрос? Вроде непохоже. Запрос простой и отрабатывается моментом. А потом все долго и упорно висит (минуты 2-3). To Victosha: Пошел в магазин за горохом:) Ответы на вопросы - 1) как достукиваешься до сервера - через линкованные таблицы? Да 2) что-то не совсем понятно, про то, что индексов нет - что и PK тоже нет? как же тогда происходит добавление записей? PK, само собой, есть. Не проиндексированы текстовые поля, по которым поиск идет. 3) как отдаешь Не понял вопрос. ---- А сервачок очень даже не слабенький. Множественных соединений и больших объемов нет. Достаточно двух пользователей: один вводит запись, другой строит незамысловатую выборку и готово - висим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 19:47 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
AVKr: "Запрос простой и отрабатывается моментом. А потом все долго и упорно висит (минуты 2-3)." Нет от этого другого спасения, кроме ограничения набора записей, передаваемого с сервера. Это его объем является тормозом при передаче по сети. Никакая другая СУБД, способ полключения и т.п. не помогут, если будут качаться по сетке многие мегабайты по каждому запросу. Думайте над тем, как помочь пользователям формулировать более конкретные критерии выборки, чем сейчас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 10:30 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
Попробовал сделать идиотизм: после получения по запросу набора записей (rs) в виде DAO.Recordseta вставил строчку rs.MoveLast. И только потом присвоил форме этот рекордсет. Эффект вышел такой: скорость выборки, само собо, заметно упала, зато НИКАКИХ блокировок. Данные вводятся асболютно без тормозов. Кто-нибудь объяснит тупому что це такое значит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 10:53 |
|
||
|
SQL Server + MS Access - 2000. Блокировка записей.
|
|||
|---|---|---|---|
|
#18+
это значит что форма загружает данные порциями а ты заставил подгрузиться все записи до назначения их в форму скажи что тебе не дает поставить для формы готовый код, который я специально для тебя написал, с адо рекордсетом? может чего непонятно , так я подскажу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 11:30 |
|
||
|
|

start [/forum/topic.php?fid=45&fpage=1668&tid=1676122]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
39ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 194ms |
| total: | 298ms |

| 0 / 0 |
