Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Не дождался результата запроса (число прочтений - 2347 )
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Не дождался результата запроса
23. Июня 2009 :: 11:09
Печать  
sql
Пытаюсь найти двоиников в справочнике ФизЛица по телефону.
Телефон-строка неграниченной длины
NormalPhone5 - функция нормализации телефона
NormalPhone4 - функция получения длины номера телефона

|SELECT СпрФ.Descr as ФИО
|           ,СпрФ.ID as [ФизЛицо $Справочник.ФизЛица]
|           ,dbo.NormalPhone5($СпрФ.Телефоны) as Нормал
|FROM $Справочник.ФизЛица as СпрФ
|INNER JOIN (
|  SELECT dbo.NormalPhone5($СпрФ1.Телефоны) as Нормал2
|     FROM $Справочник.ФизЛица as СпрФ1
|  WHERE dbo.NormalPhone4($СпрФ1.Телефоны) > 5
|  GROUP BY dbo.NormalPhone5($СпрФ1.Телефоны)
|  HAVING COUNT(*) > 1
|     ) as tabl_1 ON dbo.NormalPhone5($СпрФ.Телефоны) = tabl_1.Нормал2
|ORDER BY СпрФ.Descr

Отдельно внутренний и внешний отчеты работают примерно по 20сек.
INNER JOIN ждал 20 минут, понял, что не дождусь и бросил. Как сделать быстрее?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Не дождался результата запроса
Ответ #1 - 23. Июня 2009 :: 11:55
Печать  
ну так отдельно их и выполнить, результаты во временные таблицы, потом эти таблицы соединитьУлыбка
  
Наверх
 
IP записан
 
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: Не дождался результата запроса
Ответ #2 - 23. Июня 2009 :: 12:08
Печать  
alexdd, ради интереса попробую конечно, только сомниваюсь.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Не дождался результата запроса
Ответ #3 - 23. Июня 2009 :: 12:23
Печать  
Я тут оптимизировал запрос один  к внешней базе, там реализация групп была вида: Гр1\Гр2\Гр3 (все ГР одного размера) и запрос вхождения в группу получался таким:
Код
Выбрать все
(SELECT ag.Path
	FROM
		#ArticleFilter f JOIN ArticleGroups ag ON f.Article=ag.ArticleGroup
	) p JOIN ArticleGroups ag
	ON CHARINDEX(RTrim(p.Path),RTrim(ag.Path))>0 


Довольно шустро работает, но когда такой запрос начали разработчики джойнить к другим таблицам SQL начал жутко тормозить. Выделив лишь этот запрос во временную таблицу и приджойнивая ее к остальному запросу у меня получилось уменьшить скорость выполнения запроса в 50! раз
  
Наверх
ICQ  
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Не дождался результата запроса
Ответ #4 - 23. Июня 2009 :: 12:31
Печать  
А что хранится в поле?
Вот эта конструкция не поможет?

cast($СпрФ.Телефоны as char(80))
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Не дождался результата запроса
Ответ #5 - 23. Июня 2009 :: 12:41
Печать  
Salimbek писал(а) 23. Июня 2009 :: 12:23:
у меня получилось уменьшить скорость выполнения запроса в 50! раз

жестоко Смех
  
Наверх
 
IP записан
 
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: Не дождался результата запроса
Ответ #6 - 23. Июня 2009 :: 13:27
Печать  
Удивлен. Но запрос с INNER JOIN двух временных таблиц выполнен за 39 сек.
ТРЕБУЮ ОБЪЯСНЕНИЙ!!! Улыбка
  
Наверх
 
IP записан
 
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: Не дождался результата запроса
Ответ #7 - 23. Июня 2009 :: 13:30
Печать  
Подозреваю, что прирост больше чем в 50 раз. Очень довольный
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Не дождался результата запроса
Ответ #8 - 24. Июня 2009 :: 10:41
Печать  
vovan519 писал(а) 23. Июня 2009 :: 13:27:
Удивлен. Но запрос с INNER JOIN двух временных таблиц выполнен за 39 сек.
ТРЕБУЮ ОБЪЯСНЕНИЙ!!! Улыбка

Ну дак... в первом запросе у тебя берется справочник физлиц, далее к каждой из записей формируется джойнящаяся таблица (это ты знаешь, что таблица одна и та же, а в общем случае, она может зависеть от обрабатываемой записи, вот SQL и рассчитывает, видимо, ее каждый раз). Когда же ты формируешь временную таблицу, то соединить две таблицы для SQL-а элементарное дело
  
Наверх
ICQ  
IP записан
 
vovan519
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 18. Декабря 2008
Re: Не дождался результата запроса
Ответ #9 - 25. Июня 2009 :: 09:26
Печать  
А где можно почитать именно про поряд и оптимизацию выполнения запросов.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не дождался результата запроса
Ответ #10 - 25. Июня 2009 :: 09:40
Печать  
vovan519 писал(а) 23. Июня 2009 :: 13:27:
Удивлен. Но запрос с INNER JOIN двух временных таблиц выполнен за 39 сек.
ТРЕБУЮ ОБЪЯСНЕНИЙ!!! Улыбка

объяснение можно попытаться получить из плана выполнения запроса
  

1&&2&&3
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не дождался результата запроса
Ответ #11 - 25. Июня 2009 :: 09:49
Печать  
А если логику поменять?
Зачем для выяснения дублей нормализовывать тел. номера?
Сджойнить две таблицы, сгруппировав по количеству > 1, а эти записи уже нормализовывать (если нужно, конечно).


а, епт, пардон.
Не догнал сразу, что пытаются найти одинаковые тел. номера среди оформленных неверно.
« Последняя редакция: 26. Июня 2009 :: 04:07 - spock »  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать