Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Свой справочник периодических значений (число прочтений - 5669 )
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 записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать