powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Нужно ли после DELETE делать PACK?
25 сообщений из 28, страница 1 из 2
Нужно ли после DELETE делать PACK?
    #34519799
shanton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удаляя запись из таблицы, с помощью команды DELETE, запись фактически не удаляется, а становится помеченой на удаление, это всем известно. С помощью команды SET DELETE ON помеченные записи игнорируются. Но кода я хочу посчитать количество строк командой RECCOUNT(), то в результате получаю все записи, включая помеченный на удаление. Какое тут правило? Может есть список команд, которые не игнорируют помеченные записи? Нужно ли делать PACK или можно гарантировать корректную работу не PACK-ая таблиц? Большое спасибо!
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34520037
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
sele MyTable
count to lnCount
? lnCount
или
Код: plaintext
1.
2.
select count(*) as nCount from MyTable into cursor tcount
? tcount.nCount
use in tcount

Кроме RECCOUNT() с SET DELETE ON никаких проблем нет ни у каких команд, а PACK требует монопольного открытия, что создаст уйму проблем, когда ты решишь сделать прогу сетевой, поэтому настоятельно не рекомендую делать PACK после каждого удаления.
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34520042
EndFor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
reccount() подсчитывает ВСЕ записи....
а, например, count for !deleted() to myvar подсчитывает только не помеченные на удаление записи...
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34520578
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет.
________
Не дадим распространиться заразе политкорректности!
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34520631
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Reccount() вообще ничего не подсчитывает.

В заголовке файла DBF хранится число, содержащее общее количество записей. Вне зависимости от того, помечена данная запись на удаление или нет. Вот Reccount() и возвращает это значение.

При настройке SET DELETED ON, любая функция или команда, которая действительно считает записи будет подсчитывать только и исключительно записи не помеченные как удаленные. Никаких специальных действий для игнорирования таких записей предпринимать уже не надо.

Сразу после DELETE давать команду PACK не надо. Эта операция выносится в отдельный блок процедур администратора по обслуживанию базы данных и запускается периодически раз в неделю, месяц, год. В зависимости от интенсивности удаления записей в базе данных.
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34522808
MVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MVI
Гость
Лучще команду PACK вообще никогда не выполнять, а использовать помеченные на удаление записи повторно.
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34522969
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MVIЛучще команду PACK вообще никогда не выполнять, а использовать помеченные на удаление записи повторно.

Нет. Не лучше.

Повторное использование записей, ранее помеченных как удаленные, очень сильно напоминает "закат солнца вручную". Это связано с очень большим количеством программирования по замене стандартного функционала FoxPro. Поищите по форуму. Неоднократно обсуждалось.
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34523238
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ Повторное использование записей, ранее помеченных как удаленные, очень сильно напоминает "закат солнца вручную".
К сожалению на FoxPro есть задачи 24/7/365 - получить доступ в монопольном режиме очень сложно. Упаковка открытых таблиц другими пользователями это точно "закат солнца вручную"... Так что для таких задач это единственный выход... В принципе - это как правило не более 30 строк кода (для INSERT) + новый бинарный индекс в VFP 9.0 был специально создан в том числе, чтобы облегчить работу по управлению удаленными записей...

Хотя я согласен - упаковывать таблицы нужно как можно чаще в FoxPro по причине проблем с ростом индексов и многопользовательским доступом, особенно в ранних версиях FoxPro...
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34523364
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Ch ВладимирМ Повторное использование записей, ранее помеченных как удаленные, очень сильно напоминает "закат солнца вручную".
К сожалению на FoxPro есть задачи 24/7/365 - получить доступ в монопольном режиме очень сложно.
Даже в такой постановке возникает много вопросов. Т.е. "в принципе" такое возможно, но "на практике" очень быстро пользователи откажутся от использования в качестве хранилища данных именно файлы DBF.

При таком режиме работы возникает очень много сопутствующих проблем, среди которых упаковка - далеко не самая главная. И остановка на час...другой с некоторой периодичностью все-равно будет неизбежна. Какие бы системы хранения не использовались.
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34523547
FFFFFFFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При запуске программы берем в локальный курсор
Select ... Where ! Deleted()
и не видим удаленных.
Ну, а если есть возможность открыть монопольно,
то Pack.
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34524753
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FfffffffПри запуске программы берем в локальный курсор
Select ... Where ! Deleted()
и не видим удаленных.

Вы сами-то пробовали то, что советуете? Такое будет работать только в том случае, если источником данных запроса будет только одна таблица. Если таблиц-источников больше, то результат запроса становится не предсказуемым.

Единственным гарантированным способом отсечения записей помеченных как удаленные является настройка SET DELETED ON и никак иначе. Все остальное работает при определенных условиях для решения частных задач.
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34525132
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну допустим и не единственный

нормально работает и индекс с условием нот делейтед,
в 9-ке оптимизирован
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34525246
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex11100ну допустим и не единственный

нормально работает и индекс с условием нот делейтед,
в 9-ке оптимизирован
Эх... Опять Вы читаете отдельные слова, а не все предложение... Повторю то, что Вы не дочитали

ВладимирМВсе остальное работает при определенных условиях для решения частных задач.
-) Внутри команды Select-SQL индекс с FOR-условием не используется.
-) При программной обработке данных, как правило, главный индекс вообще отключается.

Т.е. индекс с FOR-условием - это частное решение частной задачи. В общем случае - не годится.
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34525279
Fffffffff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы сами-то пробовали то, что советуете?
Владимир. Ну это частный случай, что вы сказали.
Не передергивайте.
Ничто не мешает делать выборку из одной таблицы
без связей.
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34525369
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрика, действительно в 9-ке изменилось поведение.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CLEAR 

CREATE CURSOR test1 (f1 i)
SELECT test1
INDEX ON f1 TAG f1 FOR !DELETED()

CREATE CURSOR test2 (f1 i)
SELECT test2
INDEX ON f1 TAG f2 FOR !DELETED()

INSERT INTO test1 VALUES ( 1 )
INSERT INTO test1 VALUES ( 2 )

INSERT INTO test2 VALUES ( 1 )
INSERT INTO test2 VALUES ( 3 )

SYS( 3054 , 11 )

SET DELETED OFF 
?SET('deleted')
SELECT * from test1 INNER JOIN test2 ON test1.f1 = test2.f1 INTO ARRAY arr

SET DELETED ON  
?SET('deleted')
SELECT * from test1 INNER JOIN test2 ON test1.f1 = test2.f1 INTO ARRAY arr
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34525532
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, да. Но здесь опять же есть ограничения.

Индексы, основанные на записях, помеченных для удаления
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34525757
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМНу, да. Но здесь опять же есть ограничения.


Э-э-э, кроме "большого" индекса других ограничений не увидел - это во первых, во-вторых в моём примере используется обьединение (inner join), а про это в хелпе ни слова, ведь раньше как раз с этим были проблемы, а where not deleted() для одной таблицы можно было использовать ещё в 5-ке.
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34526824
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, видимо подправили оптимизацию. Хотя, по-моему, для целей FULL-оптимизации, логичнее делать отдельный индекс типа Binary по выражению Deleted(). Ведь все-равно это работает только для настройки SET DELETE ON.
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34526897
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
слав, те ...

дошло через год ....

но все-равно сет будем дергать - такая у нас религия
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34527313
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex11100слав, те ...

дошло через год ....

но все-равно сет будем дергать - такая у нас религия

Это Вы для кому отвечали? Если мне, то Вам следует ВНИМАТЕЛЬНО ознакомиться со статьей HELP по ссылке. Приведу выдержку из этой статьи:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CLEAR
CLOSE DATABASE ALL
SYS( 3054 , 1 )
CREATE TABLE myTable (f1 I,f2 I)
INDEX ON f1 TAG f1_NotDel FOR NOT(DELETED())
INDEX ON f1 TAG f1_Del FOR DELETED()

SET DELETED OFF
SELECT * FROM myTable WHERE ;
  (NOT(DELETED()) AND f1> 3 ) OR ;    && Тэг f1_NotDel используется для оптимизации.
  (DELETED() AND f1< 3 ) ;       && Тэг f1_Del используется для оптимизации.
  INTO CURSOR tempCursor

SELECT * FROM myTable WHERE ;
  (f1> 3  AND NOT(DELETED())) OR ;   && Не оптимизируемое. f1> 3  идет первым.
  (f1< 3  AND DELETED()) ;      && Не оптимизируемое. f1< 3  идет первым.
  INTO CURSOR tempCursor

Т.е. при настройке SET DELETED OFF, при определенных условиях, FOR DELETED() по прежнему НЕ ИСПОЛЬЗУЕТСЯ. Не сам индекс, а его FOR-условие.
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34527956
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ошибся, значит
не дошло

....
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34528125
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мысли в слух.

Вообще-то, хорошо, что появилась оптимизация на фильтрованный индекс по deleted (не сам индекс по deleted, а именно фильтрованный индекс) - это избавляет от построения дополнительного индекса для rushmore.

Остается только проверить стабильность работы такого фильтрованного индекса, в ранних версиях были проблемы с транзакциями.
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34528205
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 PaulWist

невозможно не двигаться вперед
per aspera ad astra
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34537972
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex11100ошибся, значит
не дошло

....

Если бы Вы научились ВНЯТНО излагать свои мысли, то, я бы понял что именно Вы имеете в виду. В данном случае я понял так: ВЫ САМИ ошиблись и не поняли о чем речь. Это своего рода ВАШЕ извинение
...
Рейтинг: 0 / 0
Нужно ли после DELETE делать PACK?
    #34538764
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
за что мне извиняться??
за то что использование фильтра Вы считаете предпочтительным?
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Нужно ли после DELETE делать PACK?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]