|
v7: Программная переиндексация dbf файла конфигурации | ☑ | ||
---|---|---|---|---|
0
МатьКузи
16.02.19
✎
11:07
|
Здравствуйте ! Вопрос знатокам 1C v7.7
Возникла такая проблема. Есть самопальная ТиС на платформе 7.7 с файловой организацией. База небольшая: все вместе dbf менее 400 мгб. Есть справочник с длинным реквизитом (150 знаков), по которому включена сортировка, т.е. строится индекс.Изначально размер этого dbf 1,5 мгб (около 7600 записей), индексный файл 4,6 мгб. Программно добавляю в него разово много записей, порядка 10-15 тысяч, пришедших извне. Индексный файл при этом растет в страшно какой прогрессии. Достигает размера 2 гига и, соответственно, 1C v7.7 вырубается. Ограничил прием записей в справочник до тех пор, пока индексный файл не превысил 1,5 гига, удалил все cdx, переиндексировал. Интересующий cdx сократился до 7 Мгб ! Вот и вопрос : в чем причина ? И можно ли средствами работы с dbf временно отключить индекс, а после переиндексировать программно? Пробовал: "ОткрытьФайл("SC999.dbf")" его не отрывает. Похоже платформа открывает его с самого начала в монопольное пользование. Прошу помощи. Спасибо |
|||
1
ДенисЧ
16.02.19
✎
11:12
|
"справочник с длинным реквизитом (150 знаков), по которому включена сортировка, т.е. строится индекс"
Расстрелять. Программно, средствами встроенного языка сделать это нельзя (не расстрелять, конечно, а переиндексировать). А причина роста - в особенностях работы движка 1с с dbf. |
|||
2
Злопчинский
16.02.19
✎
12:17
|
Че, егаис пилишь?
|
|||
3
Злопчинский
16.02.19
✎
12:18
|
Как вариант - попробовать то же самое на скуле
|
|||
4
uno-group
16.02.19
✎
13:04
|
Может ввести реквизит знаков в 20 скопировать туда первые 20 символов из 150 злачного. Потом вместо найти по реквизиту строить отбор по реквизиту и искать точное совпадение полного реквизита.
|
|||
5
hogik
16.02.19
✎
14:49
|
(0)
"Вот и вопрос : в чем причина ?"(c) Причина в том, что существует ограничение на размер ключа в индексе 117 байт. |
|||
6
Смотрящий
16.02.19
✎
14:52
|
(0) А накой такое длинное поле индексируемое ? Может его хэшировать и индекс уже строить по хэшу ?
|
|||
7
МатьКузи
16.02.19
✎
15:30
|
(2) Догадливый !
(3) Про скул сейчас и смотрю |
|||
8
МатьКузи
16.02.19
✎
15:33
|
(4) Индекс делается для быстрого поиска. А предложенный вариант сильно замедлит поиск
|
|||
9
МатьКузи
16.02.19
✎
15:35
|
(5) На самом деле там индекс по 128 символам. Но это не причина роста размера файла. Повторюсь, при переиндексировании его размер возвращается в "норму"
|
|||
10
МатьКузи
16.02.19
✎
15:37
|
(1) За что расстреливать ?
|
|||
11
ДенисЧ
16.02.19
✎
16:40
|
(10) За индексы по строкам в 150 символов
|
|||
12
Garykom
гуру
16.02.19
✎
16:45
|
(0) Галку "Сортировка" оставить а "Отбор по реквизиту" снять уже пробовал?
|
|||
13
Garykom
гуру
16.02.19
✎
16:46
|
А еще лучше вариант разбить длинный реквизит в 150 символов на два более коротких по 75 и использовать оба
|
|||
14
hogik
16.02.19
✎
17:23
|
(9) Но это не причина роста размера файла.
Это-это. :-) Читайте 30 сообщение в теме: https://forum.infostart.ru/forum9/topic36308/ |
|||
15
Попытка1С
16.02.19
✎
17:31
|
(13) ++
|
|||
16
МатьКузи
16.02.19
✎
18:25
|
(14) Спасибо, как раз в тему
|
|||
17
MWWRuza
гуру
17.02.19
✎
17:01
|
Есть еще вариант. Мне показался очень хорошим. Избавиться от лишних полей с сортировкой, особенно для таких громоздих реквизитов, как ШК "новой" акцизки, 150 символов.
Не надо без необходимости переходить на SQL, но никто не мешает использовать ВК, которые умеют делать поиск по базе лучше, чем штатный движок 1С. Вместо "НайтиПоРеквизиту", который требует признак сортировки, для поиска новых акцизок, я использую функцию в ГМ: НайтиМаркуSqlLite(ШК), где ШК это код марки. Вот сама функция: Функция НайтиМаркуSqlLite(ШК) Экспорт Перем Запрос; Попытка БазаДанных = СоздатьОбъект("SQLiteBase"); Исключение ЗагрузитьВнешнююКомпоненту("1sqlite.dll"); БазаДанных = СоздатьОбъект("SQLiteBase"); КонецПопытки; БазаДанных.Открыть(":memory:"); Запрос = БазаДанных.НовыйЗапрос(); Запрос.ВыполнитьЗапрос("create virtual table Марки using dbeng(Справочник.Марки)"); Текст = "SELECT |code Код, |id [Марка :Справочник.Марки] |FROM Марки |WHERE ismark <> '*'"; Текст = Текст + " |AND КодНовМарк LIKE '%" + СокрЛП(ШК) + "%'"; Попытка Тз = Запрос.ВыполнитьЗапрос(Текст); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; Если Тз.КоличествоСтрок() > 0 Тогда ИскМарка = Тз.ПолучитьЗначение(1, "Марка"); Возврат ИскМарка; Иначе Возврат 0; КонецЕсли; КонецФункции работает не хуже(даже быстрее!) чем штатная "НайтиПоРеквизиту", а главное не требует признак "Сортировка" у реквизита, а значит проблем с "распухающим" индексом нет принципиально. Попробуйте, думаю, Вам понравится... |
|||
18
MWWRuza
гуру
17.02.19
✎
20:30
|
+(17)Не требует ничего, кроме как, поместить саму длл в каталог программы или ИБ. Где ее взять, думаю сами найдете.
|
|||
19
MWWRuza
гуру
17.02.19
✎
20:33
|
Можно сделать универсальную функцию, если вместо "|id [Марка :Справочник.Марки]" передавать наименование справочника из параметра функции, но у меня такой задачи не стояло...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |