Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Нужно ли после DELETE делать PACK? / 25 сообщений из 28, страница 1 из 2
11.05.2007, 16:06
    #34519799
shanton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли после DELETE делать PACK?
Удаляя запись из таблицы, с помощью команды DELETE, запись фактически не удаляется, а становится помеченой на удаление, это всем известно. С помощью команды SET DELETE ON помеченные записи игнорируются. Но кода я хочу посчитать количество строк командой RECCOUNT(), то в результате получаю все записи, включая помеченный на удаление. Какое тут правило? Может есть список команд, которые не игнорируют помеченные записи? Нужно ли делать PACK или можно гарантировать корректную работу не PACK-ая таблиц? Большое спасибо!
...
Рейтинг: 0 / 0
11.05.2007, 16:53
    #34520037
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли после DELETE делать PACK?
Код: 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
11.05.2007, 16:54
    #34520042
EndFor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли после DELETE делать PACK?
reccount() подсчитывает ВСЕ записи....
а, например, count for !deleted() to myvar подсчитывает только не помеченные на удаление записи...
...
Рейтинг: 0 / 0
11.05.2007, 21:50
    #34520578
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли после DELETE делать PACK?
Нет.
________
Не дадим распространиться заразе политкорректности!
...
Рейтинг: 0 / 0
11.05.2007, 23:12
    #34520631
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли после DELETE делать PACK?
Reccount() вообще ничего не подсчитывает.

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

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

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

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

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

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

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

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

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

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

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

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

Т.е. индекс с FOR-условием - это частное решение частной задачи. В общем случае - не годится.
...
Рейтинг: 0 / 0
15.05.2007, 10:23
    #34525279
Fffffffff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли после DELETE делать PACK?
Вы сами-то пробовали то, что советуете?
Владимир. Ну это частный случай, что вы сказали.
Не передергивайте.
Ничто не мешает делать выборку из одной таблицы
без связей.
...
Рейтинг: 0 / 0
15.05.2007, 10:43
    #34525369
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли после DELETE делать PACK?
Смотрика, действительно в 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
15.05.2007, 11:15
    #34525532
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли после DELETE делать PACK?
Ну, да. Но здесь опять же есть ограничения.

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


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

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

но все-равно сет будем дергать - такая у нас религия
...
Рейтинг: 0 / 0
15.05.2007, 18:27
    #34527313
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли после DELETE делать PACK?
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
16.05.2007, 07:31
    #34527956
alex11100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно ли после DELETE делать PACK?
ошибся, значит
не дошло

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

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

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

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

....

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


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