Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Свой справочник периодических значений (число прочтений - 5670 )
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Свой справочник периодических значений
04. Февраля 2014 :: 10:01
Печать  
Здравствуйте.
Нужно было хранить периодические значения на документ в разрезе Товар+Склад.

Сделал справочник:
Товар [Справочник.Номенклатура],
Склад [Справочник.МестаХранения],
Значение [Неопределенный],
Документ [Документ],
Тип [Перечисление],
НеИспользуется [Число(1)],
Основание [Документ],
Позиция [Строка(24)].

Сделал функции в sql для получения последнего значения на дату и на документ.
Код
Выбрать все
CREATE function GetValueByDoc(@tov char(9), @skl char(9), @type char(9), @doc char(9))
returns char(23)
begin
declare @val char(23)
set @val = ''
select top 1
	@val = p.sp815
from sc822 as p (nolock)
where
	p.sp813 = @tov
	and p.sp814 = @skl
	and p.sp817 = @type
	and right(p.sp816, 9) = @doc
	and p.sp818 = 0
order by p.sp820 desc

select @val = case left(@val, 1)
		when 'N' then ltrim(right(@val, 22))
		when 'D' then substring(@val, 2, 8)
		else substring(@val, 7, 9)
		end
select @val = case @val when '                       ' then NULL else @val end

return @val
end  



На все реквизиты (кроме Значение) установил признак сортировки, но чую, что в запросах эти индексы не использую. За 5 месяцев накопилось over1.600.000 записей. Надо сделать, чтобы выборка работала быстрее.

Подскажите как использовать индексы в запросах. Или они уже используются самим sql-ем и быстрее запрос не получится?
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #1 - 04. Февраля 2014 :: 13:24
Печать  
Eprst выходи
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #2 - 04. Февраля 2014 :: 21:13
Печать  
Цитата:
На все реквизиты (кроме Значение) установил признак сортировки

На все - совершенно бессмысленно (если речь только об этом запросе) и даже вредно, т.к. сильно увеличивает время записи в таблицу и увеличивает размер самой таблицы.

Работать будет все равно только один индекс. Поэтому можно оставить только один - самый селективный. Вероятнее всего это индекс по Товар или Документ.
Если выбор падет на индекс по документу, то нужно будет избавиться от right и в функцию передавать @doc char(13).

Крайность - индекс с составным ключом (sp813,sp814,sp817,sp816,sp818,sp820). Он будет максимально селективным для данного запроса.
Но такие индексы можно сделать только нештатно.
  

1&&2&&3
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #3 - 05. Февраля 2014 :: 07:12
Печать  
Понял, буду пробовать. Спасибо
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #4 - 05. Февраля 2014 :: 10:55
Печать  
Помогло, прирост по скорости 5 раз. Еще раз спасибо.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #5 - 05. Февраля 2014 :: 16:24
Печать  
составной?
  

1&&2&&3
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #6 - 05. Февраля 2014 :: 17:37
Печать  
Не, первых 2 абзаца сделал: оставил индекс только на документе и переделал на char(13)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свой справочник периодических значений
Ответ #7 - 06. Февраля 2014 :: 04:57
Печать  
Лучше свой составной индекс ручонками создать. Можешь и в ПриНачалеРаботыСистемы прописать его проверку/создание..
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #8 - 06. Февраля 2014 :: 05:20
Печать  
Пока буду продолжать наблюдения. Если прижмет - буду думать в сторону составного.
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #9 - 06. Февраля 2014 :: 09:08
Печать  
Ладно, уговорил. Допустим, я почитаю про CREATE INDEX. Как потом им пользоваться в функции из #1?
Сейчас создал реквизит Индекс Строка(27) (p.sp8369) с сортировкой, заполнил значениями и функция выглядит так:
Код
Выбрать все
CREATE function GetValueByDoc(@tov char(9), @skl char(9), @type char(9), @doc char(13))
returns char(23)
begin
declare @val char(23)

set @val = ''
select top 1
	@val = p.sp815
from sc822 as p (nolock)
where p.sp8369 = @tov + @type + @skl
	and p.sp816 = @doc
	and p.sp818 = 0
order by p.sp820 desc

select @val = case left(@val, 1)
		when 'N' then ltrim(right(@val, 22))
		when 'D' then substring(@val, 2, 8)
		else substring(@val, 7, 9)
		end
select @val = case @val when '			     ' then NULL else @val end

return @val
end  

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свой справочник периодических значений
Ответ #10 - 06. Февраля 2014 :: 09:14
Печать  
Ну так, например.. хотя, если правильно слеплены условия, оптимизатор и так выберет вой индекс


select * from SC555 (NOLOCK INDEX=ТвойИндекс)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свой справочник периодических значений
Ответ #11 - 06. Февраля 2014 :: 09:16
Печать  
Эээээ...
Ты составной реквизит создал что ле ?
Улыбка))

  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #12 - 06. Февраля 2014 :: 09:18
Печать  
угу, попробовал
ибо есть еще функция, в которой нет проиндексированного поля документ
Код
Выбрать все
CREATE function GetValueByDate(@tov char(9), @skl char(9), @type char(9), @date char(8))
returns char(23)
begin
declare @val char(23)
set @val = ''
if (@date = '')
	begin
		select top 1
			@val = p.sp815
		from sc822 as p (nolock)
		where p.sp8369 = @tov + @type + @skl
			and p.sp818 = 0
		order by p.sp820 desc
	end
else
	begin
		select top 1
			@val = p.sp815
		from sc822 as p (nolock)
		where p.sp8369 = @tov + @type + @skl
			and left(p.sp820, 8) <= @date
			and p.sp818 = 0
		order by p.sp820 desc
	end
select
	@val =
	case left(@val, 1)
		when 'N' then ltrim(right(@val, 22))
		when 'D' then substring(@val, 2, 8)
		else substring(@val, 7, 9)
	end
select @val = case @val when '			     ' then NULL else @val end
return @val
end
 

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свой справочник периодических значений
Ответ #13 - 06. Февраля 2014 :: 09:21
Печать  
ну и нафига ?
выкинь этот реквизит, добавь индекс свой, запрос с условием поиска по этому индексу.. всё.
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #14 - 06. Февраля 2014 :: 09:24
Печать  
я так понимаю нужно будет 2 индекса строить: с документом, если мне нужно значение на документ и без него, если нужно значение на дату или на "конец времен"?
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #15 - 06. Февраля 2014 :: 09:33
Печать  
Так будет выглядеть select?:
Код
Выбрать все
select top 1
	@val = p.sp815
from sc822 as p (nolock index = VI...)
where p.sp813 = @tov
	and p.sp814 = @skl
	and p.sp817 = @type
	and p.sp816 = @doc
	and p.sp818 = 0
order by p.sp820 desc 



индекс по Документ,Товар,Тип,Склад (sp816,sp813,sp817,sp814)
sp820 - date_time_iddoc Основания

И как при добавлении записи записывать индекс?
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #16 - 06. Февраля 2014 :: 11:45
Печать  
vinogradoff писал(а) 06. Февраля 2014 :: 09:33:
И как при добавлении записи записывать индекс?

В SQL-е индекс сам "записывается" при добавлении записи.
  
Наверх
ICQ  
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #17 - 06. Февраля 2014 :: 12:44
Печать  
Да, понял, что ерунду спросил.
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #18 - 06. Февраля 2014 :: 13:54
Печать  
Код
Выбрать все
Процедура ПриНачалеРаботыСистемы()
	скл = "
	|IF NOT EXISTS (SELECT name FROM sysindexes WHERE name = 'IX_PERVAL')
	|CREATE INDEX IX_PERVAL ON SC822(SP813,SP817,SP814,ROW_ID)
	|";
	глрс.Выполнить(скл);
	//Сообщить(глрс.ПолучитьОписаниеОшибки());
КонецПроцедуры 



При первом запуске отрабатывает, пока сеанс не закрыт новые пользователи могу запускать 1С. Если все выйдут и кто-нибудь зайдет - нарушена структура индексов таблицы sc822.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #19 - 06. Февраля 2014 :: 14:34
Печать  
vinogradoff писал(а) 06. Февраля 2014 :: 13:54:
Код
Выбрать все
Процедура ПриНачалеРаботыСистемы()
	скл = "
	|IF NOT EXISTS (SELECT name FROM sysindexes WHERE name = 'IX_PERVAL')
	|CREATE INDEX IX_PERVAL ON SC822(SP813,SP817,SP814,ROW_ID)
	|";
	глрс.Выполнить(скл);
	//Сообщить(глрс.ПолучитьОписаниеОшибки());
КонецПроцедуры 



При первом запуске отрабатывает, пока сеанс не закрыт новые пользователи могу запускать 1С. Если все выйдут и кто-нибудь зайдет - нарушена структура индексов таблицы sc822.

так надо чтобы этот индекс был в dds прописан.
также есть ВК ( забыл как называется) которая заносит в dds
информацию о новых индексах.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #20 - 07. Февраля 2014 :: 03:18
Печать  
Лучше сразу свою табличку заводить. И индексы какие хочешь, и DateTime.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #21 - 07. Февраля 2014 :: 04:50
Печать  
ADirks писал(а) 07. Февраля 2014 :: 03:18:
Лучше сразу свою табличку заводить. И индексы какие хочешь, и DateTime.

это то да, но иногда нужен реальный индекс по данным документа.
Пример ПриходныеНакладные сортировать по дате счетфактуры поставщика
  
Наверх
 
IP записан
 
Mink Snopes
Junior Member
**
Отсутствует


bookkeeping considered
harmful

Сообщений: 30
Местоположение: Dombabwe
Зарегистрирован: 05. Ноября 2013
Re: Свой справочник периодических значений
Ответ #22 - 07. Февраля 2014 :: 08:53
Печать  
Z1 писал(а) 07. Февраля 2014 :: 04:50:
ADirks писал(а) 07. Февраля 2014 :: 03:18:
Лучше сразу свою табличку заводить. И индексы какие хочешь, и DateTime.

это то да, но иногда нужен реальный индекс по данным документа.
Пример ПриходныеНакладные сортировать по дате счетфактуры поставщика

В таких случаях можно попробовать вьюху создать, и по ней уже индексы строить
  
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #23 - 10. Февраля 2014 :: 12:02
Печать  
Z1 писал(а) 06. Февраля 2014 :: 14:34:
так надо чтобы этот индекс был в dds прописан.
также есть ВК ( забыл как называется) которая заносит в dds
информацию о новых индексах.

А можно вспомнить как зовётся или где взять? Что-то лень после каждой реструктуризации руками править.
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #24 - 10. Февраля 2014 :: 13:18
Печать  
Тоже заинтересовала тема, вот что нагуглил
PS На всякий случай дублирую вложение
  

ddx.zip ( 1 KB | Загрузки )
Наверх
 
IP записан
 
vinogradoff
Full Member
***
Отсутствует



Сообщений: 107
Зарегистрирован: 06. Февраля 2010
Пол: Мужской
Re: Свой справочник периодических значений
Ответ #25 - 10. Февраля 2014 :: 13:50
Печать  
Спасибо, работает.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать