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


I Love YaBB 2!

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

P.S. Безошибочных людей небывает...

Так причем тут оптимизатор запросов.
Если у Вас в Where стоит функция  пример Funct(Field)
то индекс поля Field не может быть применен для выполнения запроса.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

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

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

таблица RA для регистра и включена галка быстрая обработка движений имеет поля
IDDOC  char(9)
IDDOCDEF int
DATE_TIME_IDDOC char(23)
Если не получается запрос с виртуальными функциями то можешь переписать свой запрос без них
и в качестве поля соединения использовать IDDOC ( из таблицы RA )



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


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Декабря 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #17 - 24. Марта 2011 :: 01:01
Печать  
Объясняю все подробно, чтоб больше ни у кого ни возникло никаких вопросов. У меня есть выборка из регистра, в котором есть поле типа Документ (общий тип документа). РЕЗУЛЬТАТ ВЫБОРКИ ИЗ РЕГИСТРА Я ЛОЖУ В ВИРТУАЛЬНУЮ ТАБЛИЦУ, ИМЕННО ЕЕ Я ИМЕЮ В ВИДУ ПОД СЛОВАМИ "ВЫБОРКА ИЗ РЕГИСТРА" ВПОСЛЕДСТВИИ (с рестром больше не работаю). Из-за того, что у нашего чудесного 13-тисимвольного поля  тип неопределенный документ (Документ), длина данного поля не 9 символов (как должно быть), а 13, т.к. 1С прибавляет слева еще 4 символа, которые в свою очередь являются 36-тиричным значением IDDOCDEF (это был не код базы как я по ошибке предположил ранее!). А т.к. мне необходимо приджойнить журнал по IDDOC, то просто так этого сделать не получится. Отсюда есть 2 выхода:
1) прибавлять к IDDOC журнала 36-тиричное значение IDDOCDEF все того же журнала и пихать этот симбиоз в условие связывания ON моего джойна результата выборки из регистра с журналом по чудесному 13-символьному полю типа Документ (это сразу отмел, кто знает что такое перевод из 10-тичного числа в 36-тиричное, тем более реализованный на скуле, тот поймет почему);
2) отнимать от нашего 13-символьного поля регистра эти самые четыре символа и сделать с ним все тоже самое, что и с симбиозом в 1)-м пункте. На этом я и остановился.
Я знаю что поле IDDOC журнала длиной 9 символов, но для универсальности решил извлекать его длину через DATALENGTH и пихать результат в RIGHT. Получилось примерно такое условие связывания
Код
Выбрать все
...
ON RIGHT(#VT.ЧудесноеПолеДокумент, DATALENGTH(_1SJourn.IDDOC)) = _1SJourn.IDDOC
... 


Так вот при такой постановке условия все работает ужасно медленно. А вот если вообще убрать DATALENGTH(_1SJourn.IDDOC) и поставить 9 или же

Код
Выбрать все
DECLARE @LENIDDOC int;
SET @LENIDDOC = (SELECT TOP 1 DATALENGTH(IDDOC) FROM _1SJourn);

SELECT
...
ON RIGHT(#VT.ЧудесноеПолеДокумент, @LENIDDOC) = _1SJourn.IDDOC
... 


то все работает просто замечательно (секунд 10 вместо 5 минут). При чем ну тут непроиндексированность поля ЧудесноеПолеДокумент? Оно в обоих случаях участвует в запросе. Конечно можно предположить тогда, что поле IDDOC журнала 1C непроиндексировано, ведь именно его вместе с DATALENGTH мы исключаем во 2-м примере из основного запроса, но это полный бред. Здесь очевидно что все трмоза из-за DATALENGTH в условии связывания и ни о какой непроиндексации каких либо полей речи идти не может. Надеюсь все прояснилось?
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #18 - 24. Марта 2011 :: 06:13
Печать  
Единственное, что бы я отметил - можно еще на этапе выборки во временную таблицу сразу выбирать
Код
Выбрать все
SELECT ... , Right(IDDOC, 9) as Doc FROM 


и далее
Код
Выбрать все
ON #VT.Doc = _1SJourn.IDDOC 

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #19 - 24. Марта 2011 :: 06:25
Печать  
+ к (18) и еще надо чтобы по полю
#VT.Doc был индекс  ( о чем уже неоднократно упоминалось )

НУ и саму такую таблицу #VT надо понимать что сразу же после создания такая таблица может устареть если кто то перепроведет документ затрагивающий этот регистр.

PS и я считаю что в посте 18 слово можно надо заменить на слово Нужно

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


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Декабря 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #20 - 28. Марта 2011 :: 01:57
Печать  
К (18) - так сделать нельзя, ибо на выходе происходит типизация [Док $Документ]. Она применима именно к 13-ти символьному полю (на сколько я знаю).
Посему только на этапе связывания можно обрезать.

К (19). Про индексацию - может быть, про устаревание #VT - не устареет, ибо все будет происходить в монопольном режиме.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #21 - 28. Марта 2011 :: 03:56
Печать  
А что мешает в ВТ писать И идДок9 И идДок13?

К тому же - если _1SJourn все-равно джойнится, то можно типизацию $Документ сделать через 2 поля:
_1SJourn.IDDoc [Док $Документ],
_1SJourn.IDDocDef Док_вид
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #22 - 28. Марта 2011 :: 05:47
Печать  
Firedragon писал(а) 28. Марта 2011 :: 01:57:
К (18) - так сделать нельзя, ибо на выходе происходит типизация [Док $Документ]. Она применима именно к 13-ти символьному полю (на сколько я знаю).
Посему только на этапе связывания можно обрезать.

К (19). Про индексацию - может быть, про устаревание #VT - не устареет, ибо все будет происходить в монопольном режиме.

Вы разберитесь как идет типизация в таблице _1sjourn на отдельном тестовом примере ( хотя бы к одному конкретному документу).
причем в этой таблице нет поля char(13) а типизация есть.
  
Наверх
 
IP записан
 
Firedragon
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 30. Декабря 2010
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #23 - 28. Марта 2011 :: 07:19
Печать  
_1SJourn.IDDoc [Док $Документ] такое приведение невозможно, потому как поле длиной всего 9 символов. При попытке выполнения подобного запроса вылазит ошибка "Для типизации поля "док", не найдено дополнительное типизирующее поле."
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #24 - 28. Марта 2011 :: 07:51
Печать  
_1SJourn.IDDoc as [Док $Документ]
,_1SJourn.IDDocDef  as  [Док_Вид $Число]
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Тормоза при работе с вирт. таблицами t-sql
Ответ #25 - 28. Марта 2011 :: 08:02
Печать  
Док_вид
  

1&&2&&3
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать