Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Тормоза при работе с вирт. таблицами t-sql (число прочтений - 5505 )
Firedragon
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Декабря 2010
Тормоза при работе с вирт. таблицами t-sql
21. Марта 2011 :: 02:33
Печать  
Проблема следущая. Существует запрос типа:
Код
Выбрать все
SELECT
    *
    INTO #VT
FROM
    ....
 


Этот запрос выполняется быстро. Но вот выборка из этой виртуальной таблицы #VT с одновременной типизацией значений полей
Код
Выбрать все
SELECT
    VirtTab.ИмяПоля [ИмяПоля $Справочник.ИмяСправочника],
    ...
FROM
    #VT VirtTab
 


а особенно если типизируемых полей несколько, то выполняется все это ОЧЕНЬ долго. Я слышал где-то что это из-за курсоров, через которые ODBCRecordSet или драйвер ODBC (непомню) работает с вирт. таблицами. Подскажите, кто знает как с этим бороться или отошлите на ветку где этот вопрос уже рассматривался, если таковая тема уже существует. Сам я поиском форума и глазами не нашел. Печаль
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #1 - 21. Марта 2011 :: 04:05
Печать  
А если сделать выборку без типизации полей - как быстро работает?
  
Наверх
 
IP записан
 
Firedragon
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Декабря 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #2 - 21. Марта 2011 :: 04:47
Печать  
Примерно так же как и предыдущий, т.е. быстро. В этом то как раз и проблема, что именно с типизацией и именно из вирт. таблицы выборка осуществляется минуты три или больше. К примеру если мы напрямую сделаем запрос (без ВТ), т.е.:
Код
Выбрать все
SELECT
    А.ИмсяПоля [ИмяПоля $Справочник.ИмяСправочника],
    ...
FROM
    ... AS A
 


то выполняется это дело секунд за 5. Посему грешу на выборку с типизацией именно из вирт. таблицы.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #3 - 21. Марта 2011 :: 05:06
Печать  
Вообще, странно - ибо типизация полей работает уже на стороне 1С, если я правильно помню.


А какой объем выборки?
И сколько времени выполняется запрос без типизации из ВТ/с типизацией из ВТ/с типизацией из таблиц базы?
  
Наверх
 
IP записан
 
Firedragon
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Декабря 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #4 - 21. Марта 2011 :: 05:16
Печать  
Секунд 5-10 (примерно) все, кроме с типизацией выборки из ВТ. В случае с типизацией из ВТ время увеличивается до 3-5 минут. Все это время процесс скуля загружает процессор на 100%, пыхтит как сумасшедший. Я было подумал из-за памяти (ограничил скулю до 500Мб), но как показывает прямой запрос (не из ВТ) это не так, т.к. в этом случае запрос, как я уже говорил, с типизацией выполняется секунд 5-10.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #5 - 21. Марта 2011 :: 05:56
Печать  
1. Как уже тут спрашивали - какой объем выборки? (Вероятнее всего - очень большой)
2. Технология, собственно, такая - при типизации должны получится не "строки и ИД-шники", а "объекты 1С". Для этого самой 1С вызываются 1С-ные хранимые процедуры, при помощи которых и получаются объекты. В результате на каждый из типизируемых объектов (собственно [количество объектов] = [кол-во строк выборки] * [кол-во типизируемых полей в выборке]-[кол-во объектов, попавших в кэш на предыдущих запросах]) формируется запрос к БД, который получает все поля данного объекта.
Собственно отсюда и рекомендации:
1. Заранее подумать - какие поля потребуются в дальнейшей работе и добавить JOIN-ы к соответствующим таблицам с получением значений этих полей.
2. Так как не все поля нужно получать сразу, то заниматься типизацией в нужные моменты времени, т.е. если в каком-либо условии если возникла необходимость обратится к какому-то объекту, то получить его через MetaDataWork :: ЗначениеИзСтрокиБД
  
Наверх
ICQ  
IP записан
 
Firedragon
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Декабря 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #6 - 21. Марта 2011 :: 06:13
Печать  
Говорю же: при выборке напрямую запрос с типизацией работает быстро. А вот если мы результат нашего прямого запроса поместим в вирт. таблицу (как в буфер) и уже из нее еще одним запросом с типизацией попробуем вытащить данные, вот тогда скуль начинает дико выедать процессорное время и загружать систему непонятно почему. Поймите, что получаемые данные одинаковы, а вот затрачиваемое время ОЧЕНЬ разное. Объясните тогда в чем разница между выборкой из таблиц базы и выборкой из ВТ? Что такого начинает делать скуль что так вешает систему? На мой взгляд разницы не должно быть никакой, ибо и то и то таблицы.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #7 - 21. Марта 2011 :: 08:08
Печать  
(6) Приведи тестовый пример понятный для всех.

Также не помню точно но вроде select * into копирует только таблицу
без индексов может в этом причина.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #8 - 21. Марта 2011 :: 08:16
Печать  
(0) запрос без типизации работает быстро ?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #9 - 21. Марта 2011 :: 11:17
Печать  
Проверил 7.
при создании таблицы с помощью
select into индексы не создаются ( даже primary key )
Вот скорее всего именно из-за этого работа с этой таблицей очень медленно происходит.
Для более точного ответа нужен понятный тестовый пример из (0)
  
Наверх
 
IP записан
 
Firedragon
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Декабря 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #10 - 21. Марта 2011 :: 23:50
Печать  
Я не знаю как привести пример. Немогу же я всю базу здесь выложить? Подмигивание А чтобы реально загрузить скуль нуно много данных. Возьмите любую базу 1с (тестовую или рабочую) и в первом запросе (см. 1 пост) вместо ... подставьте, например, виртуальный регистр какой нибудь (у меня это РегистрОстатки) с какими нибудь измерениями и ресурсами, желательно по 3 каждого, а во втором запросе (где выборка из #VT) все измерения выбирайте с типизацией, ну и ресурсы просто для приличия выбирайте Улыбка
На счет индексов: объясните по подробней что это и как создать мне их для ВТ? Просто никогда до селе не сталкивался с ними, небыло необходимости) Я нашел пример как создать индекс, но незнаю какой тип индекса нужен ODBCRecordSet для работы, как скуль поймет что таблица приндексирована? Как мне использовать имя созданного индекса моей ВТ?

И еще... я немного соврал ранее, без типизации полей работает также медленно. И еще я немного не договорил Круглые глаза у меня к вт джойнится журнал 1с)) при чем джойнится корявенько, потому как без него се быстро выбирается из ВТ))) Простите меня дуру грешную))) Тему можно закрыть и удалить, желательно побыстрее, чтоб никто из знакомых не увидел моего позора Смех
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #11 - 22. Марта 2011 :: 05:16
Печать  
Дело в том, что у меня регулярно используются как выборки сразу от таблиц БД, так и выборки через промежуточные ВТ.
И никаких тормозов с работой ВТ я не наблюдал.

Хотя, конечно, можно попробовать еще такое - для чистоты эксперимента:
Код
Выбрать все
SELECT
    VirtTab.ИмяПоля [ИмяПоля $Справочник.ИмяСправочника],
    ...
FROM
    (
	  SELECT
		*
	  FROM
		#VT VirtTab
    ) VirtTab
  

  
Наверх
 
IP записан
 
Firedragon
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Декабря 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #12 - 23. Марта 2011 :: 00:06
Печать  
Я нашел в чем была трабла. Все тормоза были из-за ф-ции DATALENGTH которая использовалась у меня в связывании при обрезании одного из строковых полей по размеру другого строкового поля, по которым как раз таки ведется связывание. Я по простоте душевной думал, что скуль оптимизирует ее вызов. Оказалось что нет, скуль постоянно вызывал ее, что вызывало жутчайшие тормоза и время выполнения увеличивалось в разы.

p.s. обрезание делал обоснованно, так как IDDOC в регистре и IDDOC в журнале это не одно и то же. К IDDOC регистра добавляется еще и тип документа в 36-тиричной системе счисления. Хотя можно было конечно делать обратную операцию, т.е. не обрезать IDDOC регистра, а к IDDOC журнала прибавлять код базы. Но это так... размышления в слух... а вось кто столкнется с подобной проблемой. Улыбка
« Последняя редакция: 23. Марта 2011 :: 03:16 - Firedragon »  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #13 - 23. Марта 2011 :: 04:59
Печать  
Firedragon писал(а) 23. Марта 2011 :: 00:06:
Я нашел в чем была трабла. Все тормоза были из-за ф-ции DATALENGTH которая использовалась у меня в связывании при обрезании одного из строковых полей по размеру другого строкового поля, по которым как раз таки ведется связывание. Я по простоте душевной думал, что скуль оптимизирует ее вызов. Оказалось что нет, скуль постоянно вызывал ее, что вызывало жутчайшие тормоза и время выполнения увеличивалось в разы.

p.s. обрезание делал обоснованно, так как IDDOC в регистре и IDDOC в журнале это не одно и то же. К IDDOC регистра добавляется еще и тип документа в 36-тиричной системе счисления. Хотя можно было конечно делать обратную операцию, т.е. не обрезать IDDOC регистра, а к IDDOC журнала прибавлять код базы. Но это так... размышления в слух... а вось кто столкнется с подобной проблемой. Улыбка


1) блин, у меня слов нет... как из твоего исходного сообщения мы могли догадаться, что выборка из ВТ - это не просто выборка, а полноценный суровый запрос со связываниями и т.п.

2) Я так понимаю, под "IDDOC в регистре" ты подразумеваешь не поле IDDOC (регистратор движения - он всегда char(9)), а какое-то измерение/реквизит типа Документ (или даже Неопределено). Но даже в этом случае у тебя или Char(13), или Char(23) - и ты точно знаешь тип (из метаданных). Соответственно, Right(9) в первом случае и нечто похожее во втором решает твою головную боль.

Ну и более правильный способ - это сделать общий реквизит документа идДок13 (с отбором по нему - чтоб он попал в таблицу журнала и был проиндексирован). И дальше его заполнять (можно, конечно, и средствами 1С - но легко пишется триггер, который будет делать это автоматом. Только надо не забывать обновлять тригер после изменений, затрагивающих журнал - 1Ска в этих случаях его грохает).
  
Наверх
 
IP записан
 
Firedragon
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Декабря 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #14 - 23. Марта 2011 :: 07:37
Печать  
Ну вобще-то я писал еще в 10-м посте (прочтите внимательно последний абзац), что джойню журнал, в 12-м просто решил более подробно объяснить ситуацию, на случай если кто с таким же столкнется и начнет грешить на ВТ. Почему я так уверенно грешил на ВТ? Потому как немного ранее я использовал DATALENGTH и ни чего не лагало, из-за чего у меня и в мыслях не возникло грешить на него и на оптимизатор запросов. Как оказалось зря. Теперь буду знать. И вообще все в том же 10-м посте я писал что тему можно закрыть.

P.S. Безошибочных людей небывает...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать