powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Выделить удаленные записи в Grid
25 сообщений из 179, страница 5 из 8
Выделить удаленные записи в Grid
    #37143503
Banditos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TТы уж извини, но я все-таки повозмущаюсь:
1. В конце селекта надо добавить NOFILTER иначе выборки не происходит
2. Выборку надо делать не из курсора, а из таблицы, и расшаренной. Обычно так открыты в рабочем софте.
3. SET DELETED ON (а не OFF, т.к. обычно у всех стоит ON) хотя на результат у меня это не повлияло.
4. Не вижу смысла дописывать в запросе AND DELETED() (тебе надо было т.к. у тебя SET DELETED OFF)
5. Одного раза мало, сделал запрос в цикле и WHERE ID=i для разнообразия.
Вобщем я его немного приблизил к реальности. И записей добавил, а то уж больно время маленькое получалось.

1. Вообще не понял. У меня работает во всех случаях. Вероятно, что-то я не знаю.
2. Хм. В ходе эксперимента специально был взят курсор, чтобы не было погрешностей работы с дисками. Потому что я физически не могу проконтролировать все процессы винды, которые будут писатть/читать на диск. А в работе с памятью это менее существенно.
3. А вот это бред. Смысл тогда делать индекс по DELETED, чтобы потом его не использовать? Кстати, именно это показывает условие
Код: plaintext
SYS( 3054 ,  2 )
которые Вы, почему то, выбросили.
Вероятно, потому, что именно это условие и показывало Вам, что Вы - не используете данный индекс. Вот Вы и выбросили его, негодного...
И заблуждение про то, что типа
Код: plaintext
SET DELETED ON

автоматически ВКЛЮЧАЕТ индекс DELETED - оставьте другим... Ибо это уже не смешно.
Кстати, вы еще с десяток индексов сделайте по другим полям, а потом выбирайте по ID - и снова удивляйтесь, как это индексы по другим полям Вам не помогают, а даже мешают! (не удержался, простите...)
4. Бред. Пункт 3.
5. Да и я делал это чуть менее 9000 раз...

Dima TВообще-то в этих постах я по-другому выразился.
Началось все с того что прошелмимо сильно расстроился что его индекс назвали тормозом. Тесты показали что это не так. Замедление на миллисекунды сложно назвать тормозом. Но и ускорения от него никакого.
Что значит - по-другому?
Это как понимать? То есть, то, что Вы пишете, на самом деле значит совсем другое? У Вас же два поста практически подряд, явно говорят - надо каждый день все прогонять. Чего сейчас отпираться то?
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37143530
Banditos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМПериодичность выполнение упаковки и переиндексации определяется конкретной задачей и личными предпочтениями программиста. Вполне возможно, что для [b]Dima T такая периодичность вполне оправдана.[/b] Однако соблюдены все условия "правильной" работы

Владимир, выделенной фразой я засчитываю вам поражение.
Ибо в нашем споре не было никаких условий про некую мифическую задачу Dima T . Кстати, даже он сам не говорил про некую свою задачу.
Был разговор про ОБЩИЙ случай. Для всех. По теме топика.
И в в ходе разговора никто не обязан предполагать или додумывать, что кто-то из оппонентов вдруг стал говорить не по теме разговора, а про свою, узко направленную, сугубо специфическую, неоднозначно определенную, никому не нужную "конкретную задачу". Потому что адекватные люди, если они хотят привести какой-нибудь специфический пример, они об этом говорят ДО ТОГО, как приводят пример. А не после, словами типа "так это же я типа пример, конкретный и специфический" - когда его в угол загнали в споре...
А перебирать все случаи в жизни подробно - нам наших жизней не хватит. Глупое и бессмысленное занятие.
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37143655
Юристишко-выпускник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мои суждения обращенные к Диме:

итак моя задача сейчас
поговорить с Вами на тему полезности индекса при наличии уд-х записей.
т.е. сейчас мы не беседуем про: нужно паковать или нет (поговорим после).

т.е. сейчас мы предполагаем, что есть неупак-я табличка
и поймем, помогает ли наличие индекса в табличке с присутствующими уд.записями.
т.е. мы попытаемся понять для чего разработчики "придумали это".

итак в своем пример
пожалуйста сделайте все-же автоинкр. идентификатор
и затем с индексом и без выполните запрос

SELECT Count(*) as cnt FROM mytable where id > 100 INTO CURSOR tmp nofilter

результат доложите нам.

т.е. я еще раз подвожу к мысли: можно ли тестировать "для чего придумали"
только на каких-то простейших запросах?
так-ли нужно не доверять оптимизатору, который нам сообщает,
что для оптим-и он использует бинарный индекс.
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37143909
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BanditosВладимирМПериодичность выполнение упаковки и переиндексации определяется конкретной задачей и личными предпочтениями программиста. Вполне возможно, что для [b]Dima T такая периодичность вполне оправдана.[/b] Однако соблюдены все условия "правильной" работы

Владимир, выделенной фразой я засчитываю вам поражение.
Ибо в нашем споре не было никаких условий про некую мифическую задачу Dima T . Кстати, даже он сам не говорил про некую свою задачу.
Сформулирую по другому

Если одна, конкретная задача требует ежедневную упаковку, означает ли это, что, в общем случае , без "привязки" к "некой мифической задаче" периодическую упаковку базы данных не надо делать вообще?

Чтобы опять не скатится к банальной перебранке объясню свою позицию.

Я исхожу из того, что те люди с которыми я общаюсь - это люди "вменяемые" и грамотные. Раз они долгое время пишут и сопровождают работающие приложения, значит, имеют представление о том, что надо делать и чего не надо. Другое дело, что далеко не каждый может внятно объяснить свою позицию. Просто не умеет. Или же человек отвечает "по месту" на конкретный выпад со стороны оппонента.

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

В данном случае, с моей точки зрения, позиции спорящих сторон выглядят следующим образом:

Позиция 1

1. Если в качестве хранилища данных используются DBF-таблицы, то это хранилище требует периодической упаковки (PACK) и переиндексации. Вне зависимости от того, насколько правильно работает приложение
2. Индекс по deleted() не оказывает существенного влияния на производительность приложения, в силу относительно малого количества записей помеченных как удаленные

Позиция 2

1. До тех пор, пока не возникнут явные ошибки приложения выполнять упаковку и переиндексацию нет необходимости.
2. В силу того, что записи, помеченные как удаленные, физически удаляются чрезвычайно редко и их относительно много необходим индекс по deleted()

Так вот, я придерживаюсь первой позиции. Необходимо регулярное обслуживание базы данных. Как следствие, индекс по deleted() - не имеет смысла.
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37143952
Banditos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМТак вот, я придерживаюсь первой позиции. Необходимо регулярное обслуживание базы данных. Как следствие, индекс по deleted() - не имеет смысла.
Регулярное обслуживание и ежедневная упаковка с переиндексацией - ДВЕ РАЗНЫЕ ВЕЩИ!!! И не нужно одно выдавать за другое.
За регулярное обслуживание - админу плюс, за ежедневную упаковку - найти виновных и расстрелять!

Кстати, меня просто убивает тот факт, что Вы делаете индекс по DELETED, упорно его не используете, и утверждаете, что он - не имеет смысла.
Владимир, говоря Вашими же словами, индекс по ID - тоже не имеет смысла. А что? Я тут делал выборку по полю NAME, так вот, наличие индекса по ID мне не только не помогало, но и мешало!
Как следствие - индекс по ID не имеет смысла!

ЗЫ. А про бинарные индексы прочитайте. Подумайте, что это такое. Про слово "логических", которое там упоминается. Бесплатный совет: про удаленные записи, которые там приведены КАК ПРИМЕР, не читайте. Представьте лучше таблицу, в которой есть ЛОГИЧЕСКОЕ поле "ПРИЗЫВНИК", в котором значения "True" - призывник, "FALSE" - не призывник... Создайте таблицу, протестируйте...
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37143989
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BanditosDima TТы уж извини, но я все-таки повозмущаюсь:
1. В конце селекта надо добавить NOFILTER иначе выборки не происходит
2. Выборку надо делать не из курсора, а из таблицы, и расшаренной. Обычно так открыты в рабочем софте.
3. SET DELETED ON (а не OFF, т.к. обычно у всех стоит ON) хотя на результат у меня это не повлияло.
4. Не вижу смысла дописывать в запросе AND DELETED() (тебе надо было т.к. у тебя SET DELETED OFF)
5. Одного раза мало, сделал запрос в цикле и WHERE ID=i для разнообразия.
Вобщем я его немного приблизил к реальности. И записей добавил, а то уж больно время маленькое получалось.

1. Вообще не понял. У меня работает во всех случаях. Вероятно, что-то я не знаю.
Работает, но выборки не происходит :)
В случае простых селектов фокс накладывает фильтр, примерно так:
Код: plaintext
1.
2.
sele  0 
use MyTable again alias tRes
set filter to id= 10 
проверить элементарно - посмотри что возвращает dbf('tmp')
Для замеров это принципиально, т.к. выборки всех записей не происходит, соответственно и время выполнения другое.

Banditos2. Хм. В ходе эксперимента специально был взят курсор, чтобы не было погрешностей работы с дисками. Потому что я физически не могу проконтролировать все процессы винды, которые будут писатть/читать на диск. А в работе с памятью это менее существенно.
Ну померил ты скорость проца и памяти. И чего? главный тормоза сетка и винт, даже в твоем случае как только курсор в кэш фокса не влезет - начнется своп и время увеличится на порядки, а своп начнется тем раньше, чем объем больше.
Banditos3. А вот это бред. Смысл тогда делать индекс по DELETED, чтобы потом его не использовать?
Индекс должен задействоваться автоматически при его наличии, согласно хэлпу:
HELPВместо этого, вы можете создать и использовать бинарный индекс, который оптимизирует бит, отвечающий за удаление записи, для увеличения производтельности, когда вы выдаете команду SET DELETED ON
Как я понимаю SET DELETED ON это автоматическое добавление "and deleted()" во все условия.
BanditosКстати, именно это показывает условие
Код: plaintext
SYS( 3054 ,  2 )
которые Вы, почему то, выбросили.
Вероятно, потому, что именно это условие и показывало Вам, что Вы - не используете данный индекс. Вот Вы и выбросили его, негодного...
Я вообще никогда не смотрю чего SYS(3054) показывает, а выбросил чтобы он замеры не портил.
Когда меня интересует производительность - я меряю время.
Запускал пробовал оба варианта, с "and deleted()" немного медленнее . Код теста выше приведен, запусти так и так, выложи что получилось.
BanditosИ заблуждение про то, что типа
Код: plaintext
SET DELETED ON

автоматически ВКЛЮЧАЕТ индекс DELETED - оставьте другим... Ибо это уже не смешно.
Кстати, вы еще с десяток индексов сделайте по другим полям, а потом выбирайте по ID - и снова удивляйтесь, как это индексы по другим полям Вам не помогают, а даже мешают! (не удержался, простите...)
ХЗ чего там тебе мешает, у меня так пишет:
SYS(3054, 2)SELECT * FROM mytable WHERE ID=10 INTO CURSOR tmp nofilter

Using index tag Mainid to rushmore optimize table mytable
Using index tag Del to rushmore optimize table mytable
Rushmore optimization level for table mytable: full
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144031
Banditos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TИндекс должен задействоваться автоматически при его наличии, согласно хэлпу:
HELPВместо этого, вы можете создать и использовать бинарный индекс, который оптимизирует бит, отвечающий за удаление записи, для увеличения производтельности, когда вы выдаете команду SET DELETED ON
Как я понимаю SET DELETED ON это автоматическое добавление "and deleted()" во все условия.


Это кому индекс должен задействоваться? С чего бы? А тот факт, что оптимизатор его не использует, как бы Вам не намекает, что индекс НЕ ЗАДЕЙСТВОВАН?

Кстати, а откуда хелпик?
У меня в хелпе в комментарии к команде "SET DELETED" указано:
HELPВыполняемые Запросы, использующие для тестирования статуса "удаления" записей функцию DELETED( ), могут быть оптимизированы по технологии Rushmore Query Optimization , для этого должен быть в наличии активный индекс по функции DELETED( ) исходной таблицы.

И больше всего веселит Ваше "как я понимаю".
Ну, если все дело только в Вашем понимании, тогда да, спор бессмыслен. Ибо Ваше понимание неправильное, и действительность совсем другая.
Сказали бы сразу - "а я так понимаю это и это" - вопросов бы не было...
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144056
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BanditosРегулярное обслуживание и ежедневная упаковка с переиндексацией - ДВЕ РАЗНЫЕ ВЕЩИ!!! И не нужно одно выдавать за другое.

И в чем же заключается это "Регулярное обслуживание" ?
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144071
Banditos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TBanditosРегулярное обслуживание и ежедневная упаковка с переиндексацией - ДВЕ РАЗНЫЕ ВЕЩИ!!! И не нужно одно выдавать за другое.

И в чем же заключается это "Регулярное обслуживание" ?
Я Вас удивлю, но... (барабанная дробь) в упаковке и индексации!!!

ЗЫ. Внимание: ищем разницу в "в упаковке и индексации" и в "ежедневной в упаковке и индексации". И думаем, думаем...
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144076
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BanditosЭто кому индекс должен задействоваться? С чего бы? А тот факт, что оптимизатор его не использует, как бы Вам не намекает, что индекс НЕ ЗАДЕЙСТВОВАН?
Я твой любимый SYS(3054,2) уже процитировал, еще раз то что у меня он пишет:
SYS(3054, 2)SELECT * FROM mytable WHERE ID=10 INTO CURSOR tmp nofilter

Using index tag Mainid to rushmore optimize table mytable
Using index tag Del to rushmore optimize table mytable
Rushmore optimization level for table mytable: full
Никаких "and deleted()" только SET DELETED ON

BanditosКстати, а откуда хелпик?
Тынц

BanditosИ больше всего веселит Ваше "как я понимаю".
Ну, если все дело только в Вашем понимании, тогда да, спор бессмыслен. Ибо Ваше понимание неправильное, и действительность совсем другая.
Сказали бы сразу - "а я так понимаю это и это" - вопросов бы не было...
Если б читал внимательно, не переспрашивал бы по два раза.
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144162
Юристишко-выпускник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ твой любимый SYS(3054,2) уже процитировал, еще раз то что у меня он пишет:
SYS(3054, 2)SELECT * FROM mytable WHERE ID=10 INTO CURSOR tmp nofilter

Using index tag Mainid to rushmore optimize table mytable
Using index tag Del to rushmore optimize table mytable
Rushmore optimization level for table mytable: full
Никаких "and deleted()" только SET DELETED ON


прекрасно, то что оптимизатор по-любому использует бинарный индекс
независимо от того есть ли в таб-ке уд-е записи или их нет
это пугает?

я Вас просил остановиться только на таблицах
с наличием уд-х записей и проверить запрос:
SELECT Count(*) as cnt FROM mytable where id > 100 INTO CURSOR tmp nofilter

намекая на то, что только тестом с придуманным Вами запросом невозможно понять
для чего нужен этот индекс.
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144176
Banditos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Dima T
Тынц
[/quot]
Т.е. не смотря на этот превосходный хелп с примерами, в котором четко написано, когда достигается и когда не достигается оптимизация, Вы все равно продолжаете утверждать, что Ваше тестирование показательно и индекс по DELETED не нужен?

Т.е. все, что написано в этом хелпе - бред?
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144177
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BanditosЗЫ. Внимание: ищем разницу в "в упаковке и индексации" и в "ежедневной в упаковке и индексации". И думаем, думаем...
Запусти этот код, посмотри на результаты, и подумай чего может произойти пока ты соизволишь свое "регулярное обслуживание" провести:
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
clear 
if used('test')
	use in test
endif

CREATE TABLE test free (nId i, nVal i)
INSERT INTO test VALUES ( 1 ,  1 )
INSERT INTO test VALUES ( 2 ,  2 )
INSERT INTO test VALUES ( 3 ,  3 )
INSERT INTO test VALUES ( 4 ,  4 )

INDEX on nVal TAG nVal

USE IN test

lcCDX = FILETOSTR('test.cdx')

USE test
INSERT INTO test VALUES ( 5 ,  5 )
update test set nVal =  3  where nId =  1 

? 'Нормальный индекс'
SELECT * FROM test WHERE nVal =  3  into cursor tres
scan
	? nId, nVal
endscan


USE IN test

STRTOFILE(lcCDX, 'test.cdx')
USE test

? 'Битый индекс'
SELECT * FROM test WHERE nVal =  3  into cursor tres
scan
	? nId, nVal
endscan

sele test
? 'Скан без индекса'
set Order To
scan
	? nId, nVal
endscan

? 'Скан с индексом'
set Order To nVal
scan
	? nId, nVal
endscan
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144227
Юристишко-выпускник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЗапусти этот код, посмотри на результаты, и подумай чего может произойти пока ты соизволишь свое "регулярное обслуживание" провести:

какое отношение этот тест имеет к
советам про ежедневную упаковку таблиц (как я понимаю всех таблиц в приложении) ?

ЗЫ: евреи шоб не болел писюн знаешь шо делают? не жалко?

говорить про "зачем это надо" (бинарн индекс.) будем?
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144240
Banditos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,
Вы издеваетесь?
Вы подменяете индексы и удивляетесь разному результату?

За подобный код у меня хомячки летали по коридору, как ошпаренные!
За ручное подкладывание таблиц с одной копии, а индексов из другой - и без индексации - расстрел!

Что же я должен был увидеть в этом коде и результате тестирования?
То, что индексы автоматически не пересобираются при открытии таблицы? Это я знаю.
То, что ваш случай может произойти только в случае РУЧНОГО вмешательства криворукого программера - тоже знаю.

Так что же я должен был увидеть? Что нового почерпнуть должен был я?

ЗЫ. Когда я увижу такую ситуацию, я не буду каждый день "упаковывать и индексировать". Я буду каждый день пилить автора сего идиотизма до тех пор, пока он не исправит!

ЗЫЫ. Не индексация здесь нужна, а понижение в должности... или увольнение...
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144367
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BanditosВладимирМТак вот, я придерживаюсь первой позиции. Необходимо регулярное обслуживание базы данных. Как следствие, индекс по deleted() - не имеет смысла.
Регулярное обслуживание и ежедневная упаковка с переиндексацией - ДВЕ РАЗНЫЕ ВЕЩИ!!! И не нужно одно выдавать за другое.
За регулярное обслуживание - админу плюс, за ежедневную упаковку - найти виновных и расстрелять!
Почему? Какая периодичность обслуживания является "плюсом", а какая "расстрел на месте"? Каковы критерии, определяющие периодичность обслуживания базы?

BanditosКстати, меня просто убивает тот факт, что Вы делаете индекс по DELETED, упорно его не используете, и утверждаете, что он - не имеет смысла.
Извините, если повторю то, что Вы и так знаете.

При настройке SET DELETED ON, в случае наличия индекса по Deleted() он используется . Вне зависимости от наличия условия Deleted() в опции WHERE запроса. Это наглядно видно, если использовать настройку SYS(3054,1). Ну, а раз используется, то, соответственно, оказывает влияние на время выполнения запроса. О чем, собственно, все тесты и говорят

BanditosВладимир, говоря Вашими же словами, индекс по ID - тоже не имеет смысла. А что? Я тут делал выборку по полю NAME, так вот, наличие индекса по ID мне не только не помогало, но и мешало!
Как следствие - индекс по ID не имеет смысла!
Если Вы думали пошутить, то шутка не удалась, поскольку, если Вы не используете поиск по ID, то, действительно, индекс по ID - не нужен. В данном, конкретном запросе. Ведь индекс по ID создается вовсе не для поиска по Name, а для поиска именно по ID.

А вот индекс по Deleted() используется каждый раз в любом запросе если указана настройка SET DELETED ON. Как следствие, влияет на скорость выполнения ВСЕХ запросов. Без исключения.

BanditosЗЫ. А про бинарные индексы прочитайте. Подумайте, что это такое. Про слово "логических", которое там упоминается. Бесплатный совет: про удаленные записи, которые там приведены КАК ПРИМЕР, не читайте. Представьте лучше таблицу, в которой есть ЛОГИЧЕСКОЕ поле "ПРИЗЫВНИК", в котором значения "True" - призывник, "FALSE" - не призывник... Создайте таблицу, протестируйте...
Вы не правильно предстваляете себе цель и назначение логических полей.

Поле "Призывник", если оно логического типа, следует интерпретировать как "А является ли данный человек призывником?". Это вовсе не "призывник/не призывник". Это уже Ваше "домысливание", что данное поле может иметь всего-лишь два значения. На самом деле, даже в данном случае - это далеко не так. Ведь могут быть много разных состояний степени "призванности".

Т.е. логические поля - ни в коем случае не справочники. Это именно признаки . Некий не явный вопрос, подразумевающий только ответ типа Да/Нет. Если же Вы начинаете интерпретировать значение Да/Нет, то это означает, что Вы не правильно выбрали тип данных.
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144415
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BanditosDima T,
Вы издеваетесь?
Вы подменяете индексы и удивляетесь разному результату?
Я тебе показал что бывает при битом индексе. Подменять руками его не обязательно, достаточно того что комп на котором выполнится "UPDATE чего-нибудь" успеет записать изменение в DBF и не успеет в CDX (или наоборот), по любой причине: железо, сетка, пользователь задачу снял. Это редкость, но бывает, т.к. запись последовательно происходит, сначала один файл, затем второй.
И если это произойдет, то ближайшей переиндексации результаты запросов будут с ошибкой, если это будет долго продолжаться, то это приведет к тому что какой-нибудь пользователь это увидит и поправит согласно своим возможностям (т.е. усугубит проблему), и потом эти косяки надо будет кому-то разгребать.
Я этим "кем-то" был уже несколько раз. Поэтому предпочитаю минимизировать интервал с момента сбоя до исправления. У меня есть возможность индексировать базу каждый день, поэтому я ей пользуюсь.
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144433
Юристишко-выпускник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TBanditosDima T,
Вы издеваетесь?
Вы подменяете индексы и удивляетесь разному результату?
Я тебе показал что бывает при битом индексе. Подменять руками его не обязательно, достаточно того что комп на котором выполнится "UPDATE чего-нибудь" успеет записать изменение в DBF и не успеет в CDX (или наоборот), по любой причине: железо, сетка, пользователь задачу снял. Это редкость, но бывает, т.к. запись последовательно происходит, сначала один файл, затем второй.
И если это произойдет, то ближайшей переиндексации результаты запросов будут с ошибкой, если это будет долго продолжаться, то это приведет к тому что какой-нибудь пользователь это увидит и поправит согласно своим возможностям (т.е. усугубит проблему), и потом эти косяки надо будет кому-то разгребать.
Я этим "кем-то" был уже несколько раз. Поэтому предпочитаю минимизировать интервал с момента сбоя до исправления. У меня есть возможность индексировать базу каждый день, поэтому я ей пользуюсь.

ок., мы Вам верим - индексы бьются у Вас каждый день.

при чем здесь УПАКОВКА?

какое отношение имеет создание индексов к УПАКОВКЕ таблиц?

почему нужно паковать все таблицы?
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144514
Banditos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМИзвините, если повторю то, что Вы и так знаете.

При настройке SET DELETED ON, в случае наличия индекса по Deleted() он используется . Вне зависимости от наличия условия Deleted() в опции WHERE запроса. Это наглядно видно, если использовать настройку SYS(3054,1). Ну, а раз используется, то, соответственно, оказывает влияние на время выполнения запроса. О чем, собственно, все тесты и говорят

Не извиняю. Ибо это действительно я знаю. И понимаю. В отличии от Вас, к сожалению.

То, что индексы используются - уже хорошо, уже прогресс. Это радует, что мы с Вами дошли до момента, когда индексы у нас однозначно задействованы.
И дня не прошло.
Кстати, о каких тестах Вы говорите? Вы проводили какие-то тесты, а нам ничего не сказали? Не хорошо.

Итак, о тестах.
Тестовая среда:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE CURSOR myTable (ID Integer, Name C( 10 ))
SELECT myTable
FOR i =  10000  TO  1  STEP - 1 
	FOR j =  1000  TO  1  STEP - 1 
		INSERT INTO myTable (id, name) VALUES (j, SYS( 2015 ))
	ENDFOR 
ENDFOR 
DELETE FROM myTable WHERE RECNO() %  3  =  0 

SELECT MyTable
DELETE TAG ALL 
INDEX ON DELETED() TAG DeletedTag BINARY
INDEX ON ID TAG MainID ADDITIVE 

Тест:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SET SAFETY OFF 
CLEAR
SYS( 3054 ,  1 )
SET ESCAPE ON 
SET DELETED ON

starttime = SECONDS()
SELECT * FROM mytable WHERE ID= 10  INTO CURSOR tmp
endtime = SECONDS()
SELECT MyTable
? "а тегов у нас - " + STR(TAGCOUNT())
? "время работы - " + STR(endtime - starttime,  20 ,  8 )

Так вот. Если создать тестовую среду без:
Код: plaintext
INDEX ON DELETED() TAG DeletedTag BINARY
работает на 0.01 медленнее...

Что Вы там тестируете, интересно?

ЗЫ. А бинарные индексы Вы все же не понимаете...

ЗЫЫ. Про то, что Вы расписали мою задачу, в которой было всего 2 значения, на другой набор значений и при этом обвинили меня, что это я что-то додумал - вообще не хочу комментировать.
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144624
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BanditosSELECT * FROM mytable WHERE ID=10 INTO CURSOR tmp
Я уже писал что это не выборка, а поиск первой записи удовлетворяющей условию, т.е. равносильно команде
Код: plaintext
SET FILTER TO ...
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144626
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BanditosТак вот. Если создать тестовую среду без:
Код: plaintext
INDEX ON DELETED() TAG DeletedTag BINARY
работает на 0.01 медленнее...
а если сделать PACK ?
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144662
Юристишко-выпускник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TBanditosТак вот. Если создать тестовую среду без:
Код: plaintext
INDEX ON DELETED() TAG DeletedTag BINARY
работает на 0.01 медленнее...
а если сделать PACK ?

зачем?

мы пытаемся вести разговор
про то зачем индекс в таблице с имеющимися удаленными записями.

почему Вы игнорируете просьбу
и не желаете поговорить про оптимизацию в непакованных таблицах
и проверить запрос, отличающийся от Вашего, который Вы используете в своем тесте?
(у Вас в реальном приложении всегда заспросы одного типа? поиск по айди записи?)
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144783
Banditos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TBanditosТак вот. Если создать тестовую среду без:
Код: plaintext
INDEX ON DELETED() TAG DeletedTag BINARY
работает на 0.01 медленнее...
а если сделать PACK ?
А если по пустой таблице?

Знаете, я конечно не уверен, но почти догадываюсь, что один и тот же запрос по таблице в сто тысяч миллионов записей будет почти так же быстр, как по таблице с тремя записями.
А если и будет медленнее, то не намного. Возможно, все зависит от установок типа DELETE, FILTER, может быть BINARY...
Хотя я могу и ошибаться...
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144801
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юристишко-выпускникя Вас просил остановиться только на таблицах
с наличием уд-х записей и проверить запрос:
SELECT Count(*) as cnt FROM mytable where id > 100 INTO CURSOR tmp nofilter

намекая на то, что только тестом с придуманным Вами запросом невозможно понять
для чего нужен этот индекс.
Проверил твой запрос, код теста тут:
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
clear
set delete on
_cliptext = ''

if !file('myTable.dbf')
	CREATE table myTable free (ID Integer, Name C( 10 ))
	SELECT myTable
	FOR i =  10000  TO  1  STEP - 1 
		wait str(i) window nowait
		FOR j =  1000  TO  1  STEP - 1 
			INSERT INTO myTable (id, name) VALUES (j, SYS( 2015 ))
		ENDFOR 
	ENDFOR 
	DELETE FROM myTable WHERE RECNO() %  3  =  0 
endif

if !used('myTable')
	use myTable In  0 
endif

SELECT MyTable
use MyTable excl
DELETE TAG ALL 
INDEX ON ID TAG MainID ADDITIVE 
use MyTable shared

? 'Создали индекс MainID'
_cliptext = _cliptext + 'Создали индекс MainID' + chr( 13 )
do test

* наш самый злополучный индекс
SELECT MyTable
use MyTable excl
INDEX ON DELETED() TAG Del BINARY ADDITIVE 
use MyTable shared
? 'Создали индекс Del'
_cliptext = _cliptext + 'Создали индекс Del' + chr( 13 )
do test

proc test
SELECT MyTable
set Order To
? "Тэгов: " + STR(TAGCOUNT())
sys( 3054 ,  2 )
_cliptext = _cliptext + "Тэгов: " + STR(TAGCOUNT()) + chr( 13 )
for i =  1  to  10 
	starttime = seconds()
	SELECT count(*) FROM mytable WHERE ID> 100  INTO CURSOR tmp nofilter
	endtime = seconds()
	use in tmp
	? "Время: " + STR((endtime - starttime) *  1000 ,  6 ,  1 )
	_cliptext = _cliptext + "Время: " + STR((endtime - starttime) *  1000 ,  6 ,  1 ) + chr( 13 )
endfor
return

Результат в твою пользу, ускорение более чем в 100 раз, этому запросу очень нужен твой индекс:
Создали индекс MainID
Тэгов: 1
Время: 5980,0
Время: 5973,0
Время: 5907,0
Время: 5928,0
Время: 5894,0
Время: 5928,0
Время: 5911,0
Время: 5931,0
Время: 5902,0
Время: 5930,0
Создали индекс Del
Тэгов: 2
Время: 67,0
Время: 42,0
Время: 42,0
Время: 43,0
Время: 42,0
Время: 54,0
Время: 43,0
Время: 43,0
Время: 45,0
Время: 45,0

Правда без индекса по ID твой хитрый индекс становится балластом:
Без индексов
Тэгов: 0
Время: 5967,0
Время: 5919,0
Время: 5908,0
Время: 5911,0
Время: 5911,0
Время: 5911,0
Время: 5918,0
Время: 5933,0
Время: 5939,0
Время: 5937,0
Создали индекс Del
Тэгов: 1
Время: 13551
Время: 6377,0
Время: 6391,0
Время: 6386,0
Время: 6390,0
Время: 6399,0
Время: 6389,0
Время: 6390,0
Время: 6434,0
Время: 6409,0

Тут похоже какой-то баг оптимизатора на подобных запросах, т.к. совсем без индексов и с индексом только по ID время одинаковое.
Еще поизучаю, не ликуй раньше времени :)
...
Рейтинг: 0 / 0
Выделить удаленные записи в Grid
    #37144826
Юристишко-выпускник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TРезультат в твою пользу, ускорение более чем в 100 раз, этому запросу очень нужен твой индекс:

Правда без индекса по ID твой хитрый индекс становится балластом:


а кто утверждал, что одиночный бинарн.индекс оптим-ет выборку по айди запси?

для оптим-и выборки по айди записи как раз и нужен индекс по ID

Dima TЕще поизучаю, не ликуй раньше времени :)

мне ликование не нужно.
мне нужно, чтобы кулинар-теоретик заткнулся и ушел учить детей.
...
Рейтинг: 0 / 0
25 сообщений из 179, страница 5 из 8
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Выделить удаленные записи в Grid
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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