Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) ICASE и IIF (число прочтений - 9741 )
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: ICASE и IIF
Ответ #15 - 14. Августа 2007 :: 08:58
Печать  
1. UNION лишнее
лучше приоритет как вычислямое выражение.
2. Куча INNER JOIN когда достаточно LEFT
3. Куча дополнительных условий, которые ни на что не влияют
4. Самое главное - у 1SJourn есть индекс IDDoc   
Т.е. базовой (секция FROM) должна быть РасходнаяНакладная и уже к ней прицеплять
1SJourn по IDDoc.
  
Наверх
 
IP записан
 
Rubin
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 70
Зарегистрирован: 31. Июля 2007
Re: ICASE и IIF
Ответ #16 - 14. Августа 2007 :: 09:05
Печать  
Самое интересное, что работает )) а какие условия лишние?

И вообще. Можно поподробнее? В чем плохи INNER JOIN, как можно сделать приоритет в данном случае вычисляемым выражением? А про

Цитата:
Т.е. базовой (секция FROM) должна быть РасходнаяНакладная и уже к ней прицеплять
1SJourn по IDDoc.

вообще не понял (((. Выборка происходит по документам, какая разница, расходные прицеплять к журналу или наоборот? от этого что ли быстрее заработает?
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ICASE и IIF
Ответ #17 - 14. Августа 2007 :: 10:51
Печать  
kiruha писал(а) 14. Августа 2007 :: 08:17:
Разве что Spock что нибудь придумает Улыбка

Забить на foxpro и перейти на MSSQL Улыбка
Или на провайдер Advantage, там можно писать #TempTbl
  
Наверх
ICQ  
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ICASE и IIF
Ответ #18 - 14. Августа 2007 :: 11:17
Печать  
spock писал(а) 14. Августа 2007 :: 10:51:
kiruha писал(а) 14. Августа 2007 :: 08:17:
Разве что Spock что нибудь придумает Улыбка

Забить на foxpro и перейти на MSSQL Улыбка
Или на провайдер Advantage, там можно писать #TempTbl

Кстати, сколько не искал материала по оптимизации запросов, везде идут крохами, по разным разделам рукоблудств. Может есть какая-нить "плотная" статья?
  
Наверх
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: ICASE и IIF
Ответ #19 - 16. Августа 2007 :: 00:19
Печать  
Rubin писал(а) 14. Августа 2007 :: 09:05:
Самое интересное, что работает )) а какие условия лишние?

И вообще. Можно поподробнее? В чем плохи INNER JOIN, как можно сделать приоритет в данном случае вычисляемым выражением? А про

Цитата:
Т.е. базовой (секция FROM) должна быть РасходнаяНакладная и уже к ней прицеплять
1SJourn по IDDoc.

вообще не понял (((. Выборка происходит по документам, какая разница, расходные прицеплять к журналу или наоборот? от этого что ли быстрее заработает?

Лишние условие -
Код
Выбрать все
Журн.IDDocDef = $ВидДокумента.РасходнаяНакладная 

, требует от драйвера доп.
проверки, но ввиду того, что есть соединение с РасходнаяНакладная - ничего нового не дает.

  Когда ты ставишь INNER - это означает, что после присоединения таблицы драйвер должен сделать
еще один проход и убрать записи отсутствующие во второй таблице. Если этих записей нет - то просто лишний прогон.

1SJourn - самая большая таблица в системе. В твоем запросе она целиком и дважды тащится на клиента.
Почему не написать -
Код
Выбрать все
FROM
$Документ.РасходнаяНакладная as РН
LEFT JOIN 1SJourn as Журн
		 On Журн.IDDoc=РН.IDDoc    


В этом случае у тебя считается только часть таблицы 1SJourn, т.к. у 1SJourn есть индекс IDDoc

Как у тебя UNion убрать не знаю, т.к. не понял Цитата:
Сотр.ParentID as Автор,
           Сотр.ParentID as Отдел,
Отдел и Автор одно и то же?
  
Наверх
 
IP записан
 
Rubin
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 70
Зарегистрирован: 31. Июля 2007
Re: ICASE и IIF
Ответ #20 - 16. Августа 2007 :: 07:13
Печать  
Спасибо за полезные сведения Улыбка Я в уже углубился в процесс оптимизации )))
Я думаю, можно написать так:

Код
Выбрать все
SELECT
	Автор as [Автор $Справочник.Пользователи],
	Отдел,
	СуммаВыдал,
	Приоритет
FROM (
	SELECT
		Сотр.ID as Автор,
		Сотр.ParentID as Отдел,
		SUM(ICASE($РН.ВыдалП=1, $РН.СуммаП, 000000000000.00)) as СуммаВыдал,
		2 as Приоритет
	FROM
		$Справочник.Пользователи as Сотр
	INNER JOIN
		1SJourn as Журн On Сотр.ID = Журн.$ОбщийРеквизит.Автор  
			and Журн.Date BETWEEN {d :ДатаНач} AND {d :ДатаКон}
			and Журн.Closed = 1 AND
			and Журн.$ОбщийРеквизит.Автор IN "+Условия+"
	INNER JOIN
		$Документ.РасходнаяНакладная as РН On РН.IDDoc = Журн.IDDoc  
			and $РН.ВыдалП = 1
			and $РН.ДатаП >= {d :ДатаНач1} AND $РН.ДатаП <= {d :ДатаКон1}
	GROUP BY
		Автор, Отдел, Приоритет

	UNION ALL

	SELECT
		Сотр.ParentID as Автор,
		Сотр.ParentID as Отдел,
		SUM(ICASE($РН.ВыдалП=1, $РН.СуммаП, 000000000000.00)) as СуммаВыдал,
		1 as Приоритет
	FROM
		$Справочник.Пользователи as Сотр
	INNER JOIN
		1SJourn as Журн On Сотр.ID = Журн.$ОбщийРеквизит.Автор  
			and Журн.Date BETWEEN {d :ДатаНач} AND {d :ДатаКон}
			and Журн.Closed = 1 AND
			and Журн.$ОбщийРеквизит.Автор IN "+Условия+"
	INNER JOIN
		$Документ.РасходнаяНакладная as РН On РН.IDDoc = Журн.IDDoc  
			and $РН.ВыдалП = 1
			and $РН.ДатаП >= {d :ДатаНач1} AND $РН.ДатаП <= {d :ДатаКон1}
	GROUP BY
		Автор, Отдел, Приоритет
	) tmp
ORDER BY Отдел, Приоритет  



Но от UNION ALL я не придумал ещё как избавиться, хотя желательно..
Этот запрос выполняет что-то вроде WITH ROLLUP.
Первый запрос выбирает значения с детализацией по автору, второй - значения с детализацией по группе автора с соответствующей суммой по ней. Когда эти таблицы объединяются и упорядочиваются по отделу и приоритету получается примерно такая весчь:
1      Отдел продажи      Отдел продажи      Сумма по отделу
2      Отдел продажи      Иванов            Сумма
2      Отдел продажи      Петров            Сумма
1      Отдел закупки      Отдел закупки      Сумма по отделу
2      Отдел закупки      Сидоров            Сумма

А вот если б кто придумал, как это сделать без объединения.........................
« Последняя редакция: 16. Августа 2007 :: 08:26 - Rubin »  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать