Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Тема Использование индексов (ДБФ) часть 2. (число прочтений - 24315 )
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #15 - 13. Июля 2007 :: 15:00
Печать  
varelchik писал(а) 13. Июля 2007 :: 14:03:
Касательно остатков понятно.
а вот как быть с оборотами?
Там же даты нету.
Есть только IDDOC
по нем соединяться?


Если имеется ввиду обороты по регистру остатков.

По умолчанию 1С заводит только один индекс
IDLINE       |IDDOC,LINENO,ACTNO
т.е. iddoc+STR(lineno,4)+STR(actno,6)

Т.е. если интересует отбор по периоду, то только соединяться.

Оптимизация хранения индексов оставлена на усмотрение программиста.

Например, если поставить галочку "быстрая обработка движений" (я обычно ставлю для регистра продаж)
То появится поля DATE и TIME и индекс :

DATETIME     |DATE,TIME,IDDOC,LINENO,ACTNO
т.е. DTOS(date)+time+iddoc+STR(lineno,4)+STR(actno,6)

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

Также можно добавлять отборы движений по измерениям - появится сложный индекс по измерению.
  
Наверх
 
IP записан
 
Vaicartana
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 50
Местоположение: Far, Far Away...
Зарегистрирован: 29. Мая 2006
Пол: Мужской
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #16 - 15. Июля 2007 :: 00:53
Печать  
круто!
Если так все на самом деле, прошу у Кирилла разрешения включить все вышеизложенное в статью по работе с ДБФ.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #17 - 20. Августа 2007 :: 14:33
Печать  
Каждый индекс привязан к конкретной таблице, поэтому при соединении нескольких таблиц, чтобы индексы работали - нужно каждую соединяемую таблицу (в которой хотим и можем использовать индекс)  оформлять ввиде подзапроса .

Подзапрос составляется так, как было указано в предыдущих постах.

Пример : соединение с журналом в котором произведен отбор по индексу DOCTYPE (вид документа)
Код
Выбрать все
|  LEFT JOIN
|  ( SELECT  Жур.$ОбщийРеквизит.Автор as Автор,
|			  Жур.IDDoc as IDDoc
|	    FROM   1sjourn as  Жур   WHERE
|	   (Жур.iddocdef+DTOS(Жур.date)+Жур.time+Жур.iddoc  BETWEEN ($ВидДокумента.РасходнаяНакладная+DTOS(:НачДата~~)+'		   ') AND ($ВидДокумента.РасходнаяНакладная+DTOS(:КонДата~~)+'ZZZZZZZZZZZZZZZ')    )
|   )   as Журн  ON 



Здесь нужно  отметить, что делать такой подзапрос нужно крайне осторожно - у журнала  есть индекс IDDOC  и стандартное соединение происходит как правило по этому индексу. Оформляя подзапрос, мы делаем невозможным использование индекса IDDOC , т.е. в некоторых случаях результат будет хуже первоначального.
  
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #18 - 28. Августа 2007 :: 12:38
Печать  
Подтвердить ускорение к Регистру итогов у меня не получилось, в случае когда одно из измерений неизвестно.

Старый метод - 1.976 сек.
Новый метод - 3.615 сек.

Соответственно база закрывалась после каждого запроса

Обработка во вложении


P.S. Может я что-то где-то не допонял  Смущённый
  

___DBF.ert ( 28 KB | Загрузки )

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #19 - 28. Августа 2007 :: 13:12
Печать  
а.В шаблоне у тебя все измерения одинаковые ,но наверно это просто описка .
...
б.Какова последовательность измерений?
В старой торговле, я сейчас посмотрел : Фирма,Товар,Склад а не Фирма,Склад,Товар
Т.е. должно быть
Код
Выбрать все
стрОстатков.Склад
 


последовательность важна т.к. это строковое сложение.

в. А особенно будет заметно если добавить еще условия по фирме и товару :
Код
Выбрать все
WHERE д
BETWEEN (DTOS(:ДатаПериодаОстатков~~)+:ВыбФирма+:ВыбТовар+'	   ')
 AND (DTOS(:ДатаПериодаОстатков~~)+:ВыбФирма+:ВыбТовар+'ZZZZZZZZZ') 

  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #20 - 28. Августа 2007 :: 13:23
Печать  
Вообще наверно смысла нет вручную писать индексные выражения -дело довольно трудоемкое и громоздкое -
у меня в сыром виде есть специальный класс поддерживающий виртуальные функции -
там подстановка индексов происходит автоматически. Будет готов где то через неделю.
  
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #21 - 28. Августа 2007 :: 13:34
Печать  
1. Действительно описка была в шаблоне

2. И опять же действительно напутал с порядком измерений

После правильной расстановки

0.933 сек. НОВЫЙ
1.898 сек. Старый

Так что всё таки - Кирил ты прав с индексами на все 100%
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #22 - 29. Августа 2007 :: 07:39
Печать  
МАЛЕНЬКИЙ ВЕСЕЛЫЙ МОМЕНТ:

При использовании фильтра по индексному выражению вместо BETWEEN лучше использовать конструкцию "строкаВыражениеИндекса LIKE (строкаВыражениеФильтра)"

Причем строкаВыражениеФильтра не должна содержать "%" (любая последовательность символов) = тогда запрос будет тормозить очень сильно, а должна содержать "_" (один любой символ)

и самое главное Цитата:
LIKE "cExpression_" для условия Фильтра - полностью Оптимизируема


Пример для партий товаров в старой торговле во вложении

  

___DBF_001.ert ( 28 KB | Загрузки )

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #23 - 29. Августа 2007 :: 09:42
Печать  
Да, Супер ! Улыбка

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

Например, если задан только склад - достаточно написать :
Код
Выбрать все
|WHERE д
|LIKE (DTOS(:ДатаПериодаОстатков~~)+'_________'+'_________'+:ВыбСклад)
 



т.е. если значение отбора не задано, то при установке параметра достаточно передавать '_________'
  
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #24 - 29. Августа 2007 :: 10:27
Печать  
И еще одно наблюдение про предложение WHERE:

А ЕСЛИ МЫ ИСПОЛЬЗУЕМ СписокОбъектов -
1. придется писать громоздкое условие LIKE ... OR LIKE... для попадания в индекс
2. Использовать старинный метод IN SELECT (val FROM <ИмяВременнойТаблицы>)  - в таком случае мы опять не попадаем в индекс

либо

3. Вот такое хитрое соединение с временной таблицей
Код
Выбрать все
SELECT
             ВременнаяТаблица.val as Товар,
             ....
FROM
             $РегистрИтоги.ПартииТоваров as ПартииТоваров
INNER JOIN
	<ИмяВременнойТаблицыТоваров> as ВременнаяТаблица ON  
                          (ВременнаяТаблица.val = $ПартииТоваров.Товар) 



(у меня данных метод показал выйгрыш по скорости 15% про сравнению с "IN SELECT val")
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #25 - 29. Августа 2007 :: 11:45
Печать  
lustin писал(а) 29. Августа 2007 :: 10:27:
1. придется писать громоздкое условие LIKE ... OR LIKE... для попадания в индекс


Однозначно.
- Существенно быстрее , если задана Фирма. Если Фирма (или любое другое измерение до измерения "Товар")
не задано, то условие "LIKE ... OR LIKE.. по товару " ничего не дает,
проще добавить стандартное условие на товар.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #26 - 31. Августа 2007 :: 13:35
Печать  
Для счастливых обладателей TotalCommander'a:
Чтобы посмотреть индексы дбф-файлов без установки фоксов и иже с ним, можно воспользоваться отличным листер-плагином для тотала xBaseView, который может просматривать (а также печатать, искать, выполнять SQL запросы, импортировать и экспортировать БД) файлы практически всех БД.

П.С. Также может использоваться как автономная программа. Бесплатная версия имеет некоторые ограничения.
  

xbase.jpg ( 37 KB | Загрузки )
xbase.jpg
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #27 - 31. Августа 2007 :: 13:38
Печать  
И отдельно окно с индексами.
  

xbaseIND.jpg ( 31 KB | Загрузки )
xbaseIND.jpg
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #28 - 31. Августа 2007 :: 13:47
Печать  
JohnyDeath писал(а) 31. Августа 2007 :: 13:35:
Для счастливых обладателей TotalCommander'a:
Чтобы посмотреть индексы дбф-файлов без установки фоксов и иже с ним, можно воспользоваться отличным листер-плагином для тотала xBaseView, который может просматривать (а также печатать, искать, выполнять SQL запросы, импортировать и экспортировать БД) файлы практически всех БД.

П.С. Также может использоваться как автономная программа. Бесплатная версия имеет некоторые ограничения.


Для тех же счастливых обладателей TotalCommander'a (я к ним не отношусь, к Far'у привык) Улыбка
http://www.infostart.ru/profile/1329/projects/1053/
Автор - безусловный и многосторонний талант.
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #29 - 31. Августа 2007 :: 13:59
Печать  
Да, хорошая штука (а лучша вот это), но тут тема немного другая - про индексы в ДБФ-базах.
Как я уже говорил,  xBaseView может использоваться как автономная программа. Так что сильно не расстраивайся!  Подмигивание
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать