Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Select Val From ... (#Таблица) или ('    ','   ','   ') (число прочтений - 3102 )
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Select Val From ... (#Таблица) или ('    ','   ','   ')
10. Октября 2008 :: 06:34
Печать  
Ковырялся я тут в запросах, пробовал заменить метод УложитьСписокОбъектов() + конструкцию in (Select Val From #Таблица) на преобразование значений из укладываемого списка в строку (с пом. MetaDataWork) + включение в текст запроса в виде in ('  1 ','  2 ','  3 ')

Второй способ, особенно если элементов мало, работает быстрее.

Собственно вопрос: кто-нибудь проводил замеры того, на скольки элементах 1й и 2й метод по времени выполняются одинаково? Понятно, что можно эмпирическим путём выяснить, но может кто-то уже озадачивался?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Select Val From ... (#Таблица) или ('    ','   ','   ')
Ответ #1 - 10. Октября 2008 :: 07:42
Печать  
Время на заполнение списка учитывал?
Конечно, для 3-5 не стоит и проверять Улыбка
Замеры не производил, но ведь можно заполнять таблицу учитывая какие-то условия
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Select Val From ... (#Таблица) или ('    ','   ','   ')
Ответ #2 - 10. Октября 2008 :: 08:09
Печать  
Я замерял время выполнения всей процедуры, в том числе и заполнение списка. Т.е. просто менял 1 строчку в коде - либо используя список, либо с преобразованием элементов из списка в строку. Эх, видимо придётся самому замерами заняться...
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Select Val From ... (#Таблица) или ('    ','   ','   ')
Ответ #3 - 10. Октября 2008 :: 08:17
Печать  
pavel_tr писал(а) 10. Октября 2008 :: 08:09:
Я замерял время выполнения всей процедуры, в том числе и заполнение списка. Т.е. просто менял 1 строчку в коде - либо используя список, либо с преобразованием элементов из списка в строку. Эх, видимо придётся самому замерами заняться...

А но того  стоит делать на это замеры? Ведь загрузка sql сервера будет все время разной. Пиши как тебе удобней и понятней.
Экономь свое время.
Если хочешь увеличить на этом быстродействие то можно либо использовать Хранимые процедуры.
Либо если элеменов в списке не более 5 то можно использовать
UNION ALL и условие в Where  Id = Ind1 и.т.д.
при этом будешь попадать в индекс по id.
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Select Val From ... (#Таблица) или ('    ','   ','   ')
Ответ #4 - 10. Октября 2008 :: 08:42
Печать  
Z1 писал(а) 10. Октября 2008 :: 08:17:
А но того  стоит делать на это замеры? Ведь загрузка sql сервера будет все время разной. Пиши как тебе удобней и понятней.
Экономь свое время.

Да мне любой вариант одинаково удобен, я уже и процедурку в глобальнике написал, так что в самом отчёте меняю только 1 строчку Улыбка

Z1 писал(а) 10. Октября 2008 :: 08:17:
Если хочешь увеличить на этом быстродействие то можно либо использовать Хранимые процедуры.
Либо если элеменов в списке не более 5 то можно использовать
UNION ALL и условие в Where  Id = Ind1 и.т.д.
при этом будешь попадать в индекс по id.

Ведь я по сути говорю о том, с каким количеством элементов не выгодно использовать метод УложитьСписокОбъектов(), т.к. время, которое затратит сервер на создание временной таблицы и её заполнение будет бОльшим, чем создание строки с id'шниками. Особо актуально, к примеру, при переборе множества элементов и получения для них какой-нибудь информации из базы (получение остатков по группе товаров например).
Какую тут хранимую процедуру можно сделать? И с UNION ALL не совсем понятно   Нерешительный
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Select Val From ... (#Таблица) или ('    ','   ','   ')
Ответ #5 - 10. Октября 2008 :: 09:11
Печать  
Цитата:
И с UNION ALL не совсем понятно


например есть запрос
Код
Выбрать все
Select field1,field2,field3 from tabl where id in (a1, a2, a3)
 



Вместо этого пишем код (при условии что по id есть индекс)
Код
Выбрать все
Select field1,field2,field3 from tabl where id = a1
union all
Select field1,field2,field3 from tabl where id = a2
union all
Select field1,field2,field3 from tabl where id = a3
 


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



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Select Val From ... (#Таблица) или ('    ','   ','   ')
Ответ #6 - 10. Октября 2008 :: 09:20
Печать  
если по id есть индекс, то и id in (a1, a2, a3) приведет к index seek
так что не надо извращаться с юнион
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Select Val From ... (#Таблица) или ('    ','   ','   ')
Ответ #7 - 10. Октября 2008 :: 09:26
Печать  
trad писал(а) 10. Октября 2008 :: 09:20:
если по id есть индекс, то и id in (a1, a2, a3) приведет к index seek
так что не надо извращаться с юнион

Так и я в сущности о том же что весь subj -не совсем корректен. не  надо столько тратить усилий разработчика  на такую очень маленькую оптимизацию.
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Select Val From ... (#Таблица) или ('    ','   ','   ')
Ответ #8 - 10. Октября 2008 :: 09:34
Печать  
Z1 писал(а) 10. Октября 2008 :: 09:26:
Так и я в сущности о том же что весь subj -не совсем корректен. не  надо столько тратить усилий разработчика  на такую очень маленькую оптимизацию.

Кто в лес, кто по дрова ...  Улыбка
2 Процедуры по 15 строк это совсем не трудно. А выгода-то есть! По крайней мере на маленьких списках. Вобщем решил пока ограничить размер списка 50 элементами, будет время - поэкспериментирую
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Select Val From ... (#Таблица) или ('    ','   ','   ')
Ответ #9 - 10. Октября 2008 :: 09:43
Печать  
Правда для многоуровневых справочников не ковырял (если выбрана группа и Уложить...() вызывается с третьим параметром), да и не охота. А пока так:

Код
Выбрать все
Функция глСформироватьСтрокуЭлементовБД(сз, ИспользуемыйМетод, ОбрамлятьВКовычки=1) Экспорт
	Если сз.РазмерСписка()=0 Тогда
		Возврат ?(ОбрамлятьВКовычки=1,"''","");
	КонецЕсли;

	результат=?(ОбрамлятьВКовычки=1,"'","");
	Для а=1 по сз.РазмерСписка() Цикл
		результат=результат+шаблон("[глМета."+ИспользуемыйМетод+"(сз.ПолучитьЗначение(а))]")+"','";
	КонецЦикла;
	результат=Лев(результат,СтрДлина(результат)-?(ОбрамлятьВКовычки=1,2,3));

	Возврат результат;
КонецФункции // глСформироватьСтрокуЭлементовБД(сз) Экспорт
//------------------------------
Процедура глУложитьСписокОбъектов(рс, ТекстЗапроса, сз, ПеремТекстаЗапроса, МетодПолученияID = "ЗначениеВСтрокуБД", ПринудительноНеУкладыватьСписок = 0) Экспорт
	Если (сз.РазмерСписка()<50) или (ПринудительноНеУкладыватьСписок = 1) Тогда
		СтрокаЗамены=глСформироватьСтрокуЭлементовБД(сз, МетодПолученияID);
		ТекстЗапросаНовый=ТекстЗапроса;
		Поз=Найти(нрег(ТекстЗапроса),"select val from "+нрег(ПеремТекстаЗапроса));
		Пока Поз > 0 цикл
			ТекстЗапросаНовый=Лев(ТекстЗапросаНовый, Поз-1)
			+СтрокаЗамены
			+Прав(ТекстЗапросаНовый, ect Val From "+ПеремТекстаЗапроса));
			Поз=Найти(нрег(ТекстЗапросаНовый),"select val from "+нрег(ПеремТекстаЗапроса));
		КонецЦикла;
		ТекстЗапроса=ТекстЗапросаНовый;
	Иначе
		рс.УложитьСписокОбъектов(сз, ПеремТекстаЗапроса, ВидСправочника);
	КонецЕсли;
КонецПроцедуры // глУложитьСписокОбъектов(рс, ТекстЗапроса, сз, ПеремТекстаЗапроса) Экспорт
 

  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Select Val From ... (#Таблица) или ('    ','   ','   ')
Ответ #10 - 11. Октября 2008 :: 11:33
Печать  
Что-то у тебя подозрительный код...
Ты должен собрать элементы со всех уровней справочника, как это делает метод Уложить...()

Группа
-Группа1
--Элемент1
--Элемент2
Элемент3
Элемент4

Представь если в списке окажется Группа и элементы 3, 4 одновременно?
У тебя в пролете элементы 1 и 2 будут
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Select Val From ... (#Таблица) или ('    ','   ','   ')
Ответ #11 - 13. Октября 2008 :: 07:09
Печать  
Вадимко писал(а) 11. Октября 2008 :: 11:33:
Что-то у тебя подозрительный код...
Представь если в списке окажется Группа и элементы 3, 4 одновременно?
У тебя в пролете элементы 1 и 2 будут

Я ж написал, что для многоуровненых справочников не работает. У нас конфа самописная, 90% укладываемых списков содержат только элементы, так что мне такая реализация вполне подходит  Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать