Переключение на Главную Страницу Страницы: 1 2 3 [4] 5 6 ... 20 ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite (число прочтений - 64586 )
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #45 - 25. Октября 2007 :: 12:35
Печать  
Uzhast писал(а) 25. Октября 2007 :: 12:17:
В работающей базе строку удалить нельзя. Это при удалении помеченных объектов может случиться Улыбка

Есть еще объект.Удалить(1).
И алгоритмы, которые отвечают, за то что делают, когда делают ЭТО Улыбка

Цитата:
kms писал(а) 25. Октября 2007 :: 12:09:
Сервер не закряхтит под нагрузкой множества курсоров от наших полей, как думаешь?

А считаешь, что от запросов кряхтеть меньше должен? А если приделать в СКЛ нормальную прокрутку (с ползунком), то от чего, думаешь, больше будет кряхтеть? От нормального перемещения по таблице при помощи курсора или тормозного фетч-цикла при помощи запросов? Улыбка

Я не считаю, я думаю Улыбка
Не знаю, честно.
Серверные курсоры - это же еще и память. Много ее надо?
А что вообще даст использование курсоров, почему лучше будет?

Цитата:
kms писал(а) 25. Октября 2007 :: 12:09:
Эээ. ммм.
И зачем тогда Дима назвал ключ ключем порядка? Подмигивание

Не знаю Подмигивание ИМХО, название выглядит некрасиво Улыбка

Улыбка
Погоди-ка, ты все-таки имеешь в виду, что ключ порядка в одбц провайдере не используется для упорядочивания, или предлагаешь разделить функции упорядочивания и идентификации строки?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #46 - 25. Октября 2007 :: 12:44
Печать  
kms писал(а) 25. Октября 2007 :: 12:35:
Есть еще объект.Удалить(1).
И алгоритмы, которые отвечают, за то что делают, когда делают ЭТО Улыбка


В ДБФ фактически запись удаляется во время  "Упаковка таблиц инф. базы"
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #47 - 25. Октября 2007 :: 12:48
Печать  
kms писал(а) 25. Октября 2007 :: 12:35:
Есть еще объект.Удалить(1).
И алгоритмы, которые отвечают, за то что делают, когда делают ЭТО Улыбка

Эти алгоритмы маргинальные и вряд ли используются для удаления, например, элементов из справочника товаров или клиентов в работающей базе. Подобные вещи, скорее, для каких-то служебных целей применяются и вряд ли пересекаются с задачами, которые решаются при помощи ТП. Однако, надо бы посмотреть, что в таком случае будет с провайдером... Если результат неудовлетворительный, то придется переходить на ID. Если же, например, произойдет простой переход в самое начало таблицы, то и хрен с ним. Просто физический номер - это быстрее, чем установка упорядочивания по ИД+поиск нужного ИД+установка упорядочивания по текущему критерию выборки.

kms писал(а) 25. Октября 2007 :: 12:35:
Я не считаю, я думаю Улыбка
Не знаю, честно.
Серверные курсоры - это же еще и память. Много ее надо?
А что вообще даст использование курсоров, почему лучше будет?

А я тоже не знаю  Очень довольный Но вроде бы курсоры позволят перейти на нормальную прокрутку, а запросы вряд ли.

kms писал(а) 25. Октября 2007 :: 12:09:
Погоди-ка, ты все-таки имеешь в виду, что ключ порядка в одбц провайдере не используется для упорядочивания, или предлагаешь разделить функции упорядочивания и идентификации строки?

Ну, почему не используется, используется. Я просто хочу сказать, что поле идентифицирующее запись в ТП совершенно не обязательно должно быть связано с тем, как провайдер выбирает записи из своего источника данных.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #48 - 25. Октября 2007 :: 12:50
Печать  
kiruha писал(а) 25. Октября 2007 :: 12:44:
В ДБФ фактически запись удаляется во время  "Упаковка таблиц инф. базы"

Тут проблема в том, что не понятно, что произойдет в результате вызова GO НомерЗаписи, если запись НомерЗаписи вдруг пометилась на удаление. Ведь обычно таблицы просматриваются в режиме невидимости удаленных записей. Т.е. как себя поведет Фокс в этом случае: таки встанет на эту запись или сделают какую-нибудь пакость. Пойду доку что ли почитаю...
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #49 - 25. Октября 2007 :: 12:56
Печать  
kms писал(а) 25. Октября 2007 :: 12:35:
Погоди-ка, ты все-таки имеешь в виду, что ключ порядка в одбц провайдере не используется для упорядочивания, или предлагаешь разделить функции упорядочивания и идентификации строки?

Вообще, как я понимаю, существуют два ключа: "ИДПоле" - поле, которое используется в ТП и использующем его клиентском коде для идентификации записи. И "КлючПорядка" - выражение, которое позволяет упорядочить записи и ОДНОВРЕМЕННО служит внутренним ключом записи для провайдера (как я понимаю). Ну вот я и считаю, что такое двойное использование выражения упорядочивания не обязательным. Особенно в ДБФ. Тем более, что индексы там не всегда такую двойную нагрузку разрешают Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #50 - 25. Октября 2007 :: 13:38
Печать  
Идея понятна.

Да в принципе, согласен, что это просто детали реализации провайдера.
Две функции ключа в одбц провайдере объединены, видимо, с целью попадания в один и тот же индекс при поиске и при упорядочивании.
Если мы можем эффективно разделить поиск и упорядочивание (зависит от среды), можно разделить и функции ключей.
...
Пожалуй, для DBF разделить эффективно можно.
Есть подозрение, что и для SQL это также возможно.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #51 - 25. Октября 2007 :: 13:41
Печать  
Uzhast писал(а) 25. Октября 2007 :: 12:50:
kiruha писал(а) 25. Октября 2007 :: 12:44:
В ДБФ фактически запись удаляется во время  "Упаковка таблиц инф. базы"

Тут проблема в том, что не понятно, что произойдет в результате вызова GO НомерЗаписи, если запись НомерЗаписи вдруг пометилась на удаление. Ведь обычно таблицы просматриваются в режиме невидимости удаленных записей. Т.е. как себя поведет Фокс в этом случае: таки встанет на эту запись или сделают какую-нибудь пакость. Пойду доку что ли почитаю...

Да, это один момент.

Второй момент такой.
ТП может сохранять значение строки (CDataRow*), которое потом может использовать для сравнения на равенство с другой строкой.
Если сравнение реализовано некорректно (например, только по физическому адресу записи), то быть беде.

Предположим, мы используем физический адрес записи, как ид-поле.
ТП сохраняет строку (адрес записи).
Другой клиент удаляет строку (физически строка, конечно, просто помечается как удаленная).
Третий создает новую запись (и по несчастливому стечению обстоятельств она попадает на то же самое место)
ТП просыпается и, к примеру, удаляет (гусары, молчать), данную физическую строку.
При этом она честно проверяет, что новая строка равна старой, но сравнение адресов записей всегда возвращает равенство.

Т.е. имхо включение адреса физической записи для формирования уникального ключа - небезопасная операция.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #52 - 25. Октября 2007 :: 14:34
Печать  
Uzhast писал(а) 25. Октября 2007 :: 12:56:
Тем более, что индексы там не всегда такую двойную нагрузку разрешают

Почему же не разрешает? Все будет нормально. Улыбка
  
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #53 - 25. Октября 2007 :: 14:47
Печать  
kms писал(а) 25. Октября 2007 :: 13:41:
Другой клиент удаляет строку (физически строка, конечно, просто помечается как удаленная).
Третий создает новую запись (и по несчастливому стечению обстоятельств она попадает на то же самое место)
ТП просыпается и, к примеру, удаляет (гусары, молчать), данную физическую строку.
При этом она честно проверяет, что новая строка равна старой, но сравнение адресов записей всегда возвращает равенство.

Да, это может быть.

kms писал(а) 25. Октября 2007 :: 13:41:
Т.е. имхо включение адреса физической записи для формирования уникального ключа - небезопасная операция.

Можно попробовать оценить, насколько это опасно. Может быть, все не так страшно...
Поиск по CompareRows дает следующие места, где используется сравнение:

ActivateRow - используется при помощи вызова из клиентского кода или из провайдера для изменения текущей строки. Если ТП может найти среди видимых строк требуемую, активирует ее, если нет - то производит выбор строк из провайдера, начиная с запрашиваемой для активации. Итак две ситуации: строка есть среди видимых - простая подсветка, строки нет - подгрузка. Как может быть получена строка для активации? Клиентский код определяет требуемый элемент справочника или документ, провайдер на основе этого элемента делает поиск по ИД и получает физ.номер записи. При замене удаленной записи проблемный эффект можно возникнуть только, если среди видимых есть старая запись. Тогда она подсветится, хотя реально запрашивается совсем другая - новая.

Drag'n'Drop
Сравнение используется, насколько я понял, для оптимизации отрисовки текущей цели. Тут не может произойти что-то опасное, потому что строки ТП при этом не удаляются и не создаются. Сравниваются между собой строки, полученные из одной выборки.

Так что с моей кочки зрения, сильных отрицательных эффектов быть не должно. Собственно, он только один - подсветка устаревшей строки при активации строки по запросу от клиента или от провайдера. Этот отрицательный эффект полностью нивелируется ТП с автообовлением.

Возможен еще один эффект - при обновлении строк. ТП запрашивает N строк, начиная с некоторой данной (первой видимой). Если провайдер использует физ.номер, то он возьмет N строк начиная от новой строки. Если провайдер не использует физ.номер, а использует ИД, то он не найдет строку вообще и ему придется что-то сделать по умолчанию - например перейти в начало таблицы. В любом случае то, что произойдет - нельзя считать нормальным поведением с точки зрения пользователя Улыбка

Так что физномера - не такая страшная вещь, как кажется.

Не, ну конечно использование физномеров - не такое гладкое решение, как использование ИД. Но с другой стороны номера должны работать гораздо быстрее... Хотя тут надо бы еще подумать...
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #54 - 25. Октября 2007 :: 14:50
Печать  
spock писал(а) 25. Октября 2007 :: 14:34:
Uzhast писал(а) 25. Октября 2007 :: 12:56:
Тем более, что индексы там не всегда такую двойную нагрузку разрешают

Почему же не разрешает? Все будет нормально. Улыбка

Не будет. Пусть используется индекс PARENTID,ISFOLDER,DESCR(UPPER). У меня 5 элементов с совершенно одинаковым наименованием. Пожалуйста, верни мне из SQL-запроса с использованием этого индекса, 10 строк вверх, начиная с 4-го элемента из этих 5 одинаковых.  Язык
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #55 - 25. Октября 2007 :: 15:59
Печать  
kms писал(а) 25. Октября 2007 :: 13:41:
Предположим, мы используем физический адрес записи, как ид-поле.
ТП сохраняет строку (адрес записи).
Другой клиент удаляет строку (физически строка, конечно, просто помечается как удаленная).
Третий создает новую запись (и по несчастливому стечению обстоятельств она попадает на то же самое место)
ТП просыпается и, к примеру, удаляет (гусары, молчать), данную физическую строку.
При этом она честно проверяет, что новая строка равна старой, но сравнение адресов записей всегда возвращает равенство.

Т.е. имхо включение адреса физической записи для формирования уникального ключа - небезопасная операция.


Ни фига не понял как новая запись может попасть на  строку, которая в ДБФ - DELETED(),
но тем не менее занимает место в таблице.

Разве что адреса берутся при включенном фильтре NOT.DELETED().
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #56 - 25. Октября 2007 :: 16:50
Печать  
kiruha писал(а) 25. Октября 2007 :: 15:59:
Цитата:
Т.е. имхо включение адреса физической записи для формирования уникального ключа - небезопасная операция.

Ни фига не понял как новая запись может попасть на  строку, которая в ДБФ - DELETED(),
но тем не менее занимает место в таблице.

Практический опыт и отдаленные теоретические воспоминания говорят о том, что может.
Еще в 97 году я хлебнул немало горя во время восстановления DBF баз 1С:Торговля (мда-мда) 7.0  из-за фрагментации записей в таблицах, возникших в результате перезаписи удаленных строк.

С удовольствием восприму теоретическую базу, подтверждающую либо опровергающую корректность создания новой записи на месте помеченной, как удаленная.
Но хотелось бы ссылок на какое-либо обоснование со статусом официального Улыбка

Практическое обоснование факта, что сейчас 7.7 на DBF ведет себя по-другому (не перезаписывает удаленные) - тоже сойдет.
Но по-любому врага хотелось бы знать в литсо.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #57 - 25. Октября 2007 :: 17:09
Печать  
[quote author=kiruha link=1192855975/45#55 date=1193327958]Ни фига не понял как новая запись может попасть на  строку, которая в ДБФ - DELETED(),
но тем не менее занимает место в таблице.
[/quote]

Чтоб было понятнее, вот простой тест.
[tt]
Процедура Заполнить()
     _о =СоздатьОбъект("Справочник." +Вид()); // это была форма списка нового справочника
     _о.Новый();
     _о.Код =1;
     _о.Записать();
     _о.Новый();
     _о.Код =2;
     _о.Записать();
     _о.Новый();
     _о.Код =3;
     _о.Записать();
     _о.НайтиПоКоду(2);
     _о.Удалить(1);
     _о.Новый();
     _о.Код =4;
     _о.Записать();
КонецПроцедуры
[/tt]
Порядок будет 1, 4, 3; удаленных записей нет. (на 7.7 R27)

[sub]
Если у кого есть желание - пусть обосновывает, с меня за 10 лет хватит  8-)
[/sub]
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #58 - 25. Октября 2007 :: 18:13
Печать  
[quote author=kms link=1192855975/45#57 date=1193332196][quote author=kiruha link=1192855975/45#55 date=1193327958]Ни фига не понял как новая запись может попасть на  строку, которая в ДБФ - DELETED(),
но тем не менее занимает место в таблице.
[/quote]

Чтоб было понятнее, вот простой тест.
[tt]
Процедура Заполнить()
     _о =СоздатьОбъект("Справочник." +Вид()); // это была форма списка нового справочника
     _о.Новый();
     _о.Код =1;
     _о.Записать();
     _о.Новый();
     _о.Код =2;
     _о.Записать();
     _о.Новый();
     _о.Код =3;
     _о.Записать();
     _о.НайтиПоКоду(2);
     _о.Удалить(1);
     _о.Новый();
     _о.Код =4;
     _о.Записать();
КонецПроцедуры
[/tt]
Порядок будет 1, 4, 3; удаленных записей нет. (на 7.7 R27)

[sub]
Если у кого есть желание - пусть обосновывает, с меня за 10 лет хватит  8-)
[/sub][/quote]

Да, запись была замещена.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #59 - 25. Октября 2007 :: 18:48
Печать  
Но случай все же экзотический.
С тем же экзотическим случаем ничто не мешает сделать Id не уникальным (средствами OLEDB).

Имхо - не стоит ради этого жертвовать производительностью.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 3 [4] 5 6 ... 20
ОтправитьПечать