![]() |
![]() |
![]() |
|
Быстрый способ определения битой ссылки | ☑ | ||
---|---|---|---|---|
0
maxp77
03.08.09
✎
12:41
|
Хотел бы к статье из книги знаний Книга знаний: v8: Пустые ссылки добавить свою функцию определения битой ссылки http://infostart.ru/blogs/1241/
|
|||
1
ТелепатБот
гуру
03.08.09
✎
12:41
|
||||
2
maxp77
03.08.09
✎
12:42
|
Итак,
способ определения битой ссылки через Ссылка.ПолучитьОбъект() очень медленный; через Найти(Строка(Ссылка),"<Объект не найден>") <> 0 - некорректный (на мой взгляд), поэтому представляю на Ваш суд функцию, позволяющую быстро определить битая ссылка или нет. Текст функции: Функция ОбъектБДСуществует(ТестоваяСсылка) Экспорт МД = Метаданные.НайтиПоТипу(ТипЗнч(ТестоваяСсылка)); ИмяОбъекта = МД.Имя; ПолноеИмяОбъекта = МД.ПолноеИмя(); Запрос = новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | " + ИмяОбъекта + ".Ссылка КАК СсылкаБД |ИЗ | " + ПолноеИмяОбъекта + " КАК " + ИмяОбъекта + " |ГДЕ | " + ИмяОбъекта + ".Ссылка = &Cсылка"; Запрос.УстановитьПараметр("Cсылка", ТестоваяСсылка); РезультатЗапроса = Запрос.Выполнить(); Возврат Не РезультатЗапроса.Пустой(); КонецФункции При желании можно добавить какой-нибудь кеш для текстов запросов по полному имени объекта, но не думаю, что это сильно ускорит работу данной функции, она и без того быстро отрабатывает. |
|||
3
zbv
03.08.09
✎
12:43
|
(2) сравнительные замеры производительности проводил?
|
|||
4
H A D G E H O G s
03.08.09
✎
12:49
|
Запрос.Текст =
"ВЫБРАТЬ | ИСТИНА как НЕЧТО |ИЗ | " + ПолноеИмяОбъекта + " КАК " + ИмяОбъекта + " |ГДЕ | " + ИмяОбъекта + ".Ссылка = &Cсылка"; Запрос.УстановитьПараметр("Cсылка", ТестоваяСсылка); РезультатЗапроса = Запрос.Выполнить(); |
|||
5
Широкий
03.08.09
✎
12:52
|
Найти(Строка(Ссылка),"<Объект не найден>") ИМХО - достаточно и такого
|
|||
6
H A D G E H O G s
03.08.09
✎
12:53
|
(5) Нет.
Это достаточно медленно. |
|||
7
Bober
03.08.09
✎
12:57
|
у (2, 4) есть сущ. плюс перед (5), можно за раз обработать список из битых ссылок.
|
|||
8
MSensey
03.08.09
✎
13:28
|
(4) так будет быстрее или в чем сакраментальный смысл?
|
|||
9
Serg_1960
03.08.09
✎
13:32
|
Мне интересно - что автор получит запросом, если у него "битыми" окажутся индексы, а не данные?
|
|||
10
MSensey
03.08.09
✎
13:36
|
Битые индексы реже встречаются, чем битые ссылки. С битыми индексами вообще труба (а такок вообще бывает?).
|
|||
11
H A D G E H O G s
03.08.09
✎
13:38
|
(9) Скорее всего - не найдет объект.
(8) Ну типа 1 байт - вместо 16. Верх оптимизма :-) |
|||
12
hhhh
03.08.09
✎
13:41
|
(8) должно быть быстрее, потму что метаданные - уж очень тормозная штука.
|
|||
13
Serg_1960
03.08.09
✎
13:43
|
(10) Бывает. В файловой версии и не такое бывает. Про дублирование индексов (точнее - ключевых полей) Вы наверное слышали...
Можно мне еще один вопрос? При получении ссылки - происходит-ли обращение к данным или значение из индекса возвращается? |
|||
14
serffer
03.08.09
✎
13:46
|
У 1С вроде индексы на ссылках... план выполнения полезет в индекс.Так?
|
|||
15
MSensey
03.08.09
✎
13:48
|
А для справочника случаем не создается кластерный индекс?
|
|||
16
дущ
03.08.09
✎
13:50
|
Т.е. запрос из (2) подымает абсолютно все элементы справочника (а их может быть и 10, и 1000, и 100000) и каждый из них сравнивает с этой самой пустой ссылкой? Это точно быстрее? На больших справочниках пробовал?
|
|||
17
maxp77
03.08.09
✎
13:52
|
(4) Спасибо, со строкой "ИСТИНА как НЕЧТО" чуть быстрее должна быть.
|
|||
18
maxp77
03.08.09
✎
13:54
|
(16) не с пустой, а с битой; точно быстрее
|
|||
19
H A D G E H O G s
03.08.09
✎
13:59
|
(16) Не глупим.
Поиск по индексу. |
|||
20
maxp77
03.08.09
✎
14:02
|
(19) ну, да, извиняюсь...
А касательно битых индексов, так средствами 1С что можно сделать? |
|||
21
maxp77
03.08.09
✎
14:04
|
(19) :)
|
|||
22
H A D G E H O G s
03.08.09
✎
14:04
|
(20) Ничего.
Самое главное - узнать их наличие. Если есть - реиндексация в ТИИ |
|||
23
maxp77
03.08.09
✎
14:06
|
(22) т.е. только средствами СУБД? а для файловой такой косяк возможен?
|
|||
24
Serg_1960
03.08.09
✎
14:08
|
Сорри, за "провокационные" вопросы, но я лично "предпочитаю" делать ТиИ для поиска "битых" ссылок :) А ежели запросом, например для документов, - то поиск по пустому значению номера и даты для выявления "битых" ссылок. Медленно, но имхо, - надежнее.
|
|||
25
Фауст
03.08.09
✎
14:09
|
Функция будет воспринимать пустую ссылку как битую...
|
|||
26
maxp77
03.08.09
✎
14:10
|
через тестирование и исправление поиск быстрей получится конечно же, но мне необходимо было программно отлавливать такие ссылки а не через ТиИ
|
|||
27
maxp77
03.08.09
✎
14:11
|
(25) спасибо, косяк. Исправим.
|
|||
28
Serg_1960
03.08.09
✎
14:13
|
(провокация) Битые ссылки еще бывают и в табличных частях документов...
|
|||
29
maxp77
03.08.09
✎
14:15
|
(25) хотя какой косяк, функция определяет наличие ссылки в конкретной таблице базы, пустой там быть не должно, так что все ОК
|
|||
30
H A D G E H O G s
03.08.09
✎
14:17
|
(24) Да ну, не сильно и медленнее.
|
|||
31
maxp77
03.08.09
✎
14:19
|
(28) вот ты эту "битую" ссылку подставь в функцию и определишь битая она или нет
|
|||
32
maxp77
03.08.09
✎
14:21
|
(30) ТиИ с данной функцией не сравнивал: не было необходимости; поэтому могу только предполагать
|
|||
33
hhhh
03.08.09
✎
14:23
|
(32) ну ПолучитьОбъект() из ссылки явно должно быть быстрее, чем НайтиПоТипу в офигенном списке метаданных.
|
|||
34
maxp77
03.08.09
✎
14:24
|
(25) проверку на пустую ссылку и вообще на ссылочный тип необходимо предварительно выполнить, если в этом нет уверенности
|
|||
35
maxp77
03.08.09
✎
14:24
|
(33) ну, ну...
|
|||
36
hhhh
03.08.09
✎
14:26
|
(35) реально. Из-за этого в типовой БП такие тормозные журналы. Потому что они на ходу проверяют, есть ли реквизит в метаданных.
|
|||
37
H A D G E H O G s
03.08.09
✎
14:27
|
(33) Забьем на бутылку кефира?
Например, мой справочник СерииНоменклатуры. Со всеми характеристиками серии для алкоголя, которые загнали в реквизиты справочника товарисчи франчи КТ2000. :-) 61 реквизит + 5 ТЧ по 4-5 реквизитов. |
|||
38
maxp77
03.08.09
✎
14:32
|
(37) ого, прикольные франчи:)
|
|||
39
maxp77
03.08.09
✎
14:35
|
(3) производил
|
|||
40
hhhh
03.08.09
✎
14:41
|
(37) всё равно получит за одно обращение к базе. 61 реквизит * 100 байт, получится 6 кб. Неужели у тебя такой маломощный сервер?
|
|||
41
H A D G E H O G s
03.08.09
✎
14:44
|
(40) "Па лесам бродют санитары, они вас будут подбирать". © Агата Кристи.
Откуда 100 байт :-) ? |
|||
42
MSensey
03.08.09
✎
14:46
|
(40) а разве время выполнения в байтах измеряют?
|
|||
43
Serg_1960
03.08.09
✎
14:46
|
Отлучился на пять минут, а тут уже... бродют санитары :) Вы о чем спорите в чужой ветке? :))
|
|||
44
maxp77
03.08.09
✎
14:50
|
да, мне самому интересно что быстрее, на тех экспериментальных данных, на которых я проверял моя функция отрабатывает в разы!! быстрее аналогов. Может, где-то при каких-то условиях медленнее?
|
|||
45
H A D G E H O G s
03.08.09
✎
14:51
|
(44) Все пучком у тебя.
hhhh шутит. У него в БД просто поля - ровно по 100 байт храняться. Там - вырожденный случай :-) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |