Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Скорость вычислений в запросе / 12 сообщений из 12, страница 1 из 1
26.09.2003, 17:17
    #32277119
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость вычислений в запросе
Заранее прошу прощение за плохую читабельность
Есть запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
SELECT Bill_arrival.[Реф №], Bill_arrival.Наименование, Bill_arrival.Дата1, Bill_arrival.Дата2, round(Bill_arrival.Эквивалент1,  2 ) AS [КА+ 1 ], round(Bill_arrival.Эквивалент2,  2 ) AS [КА- 1 ],  "" AS [От А+1 ], " " AS [От А-1 ], " " AS [K+1 ], " " AS [K-1 ], " " AS [Б+1 ], " " AS [Б-1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], " " AS [T+1 ], " " AS [T-1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM Bill_arrival
WHERE (((Bill_arrival.[Реф №])=[forms]![заказ]![ref]))
UNION ALL
SELECT Bill_charge.[Реф №], Bill_charge.Наименование, Bill_charge.Дата1, Bill_charge.Дата2, " " AS [КА+1 ], " " AS [КА-1 ], round(Bill_charge.Эквивалент1,  2 ) AS [От А+ 1 ],round(Bill_charge.Эквивалент2,  2 ) AS [От А- 1 ], " " AS [K+1 ], " " AS [K-1 ], " " AS [Б+1 ], " " AS [Б-1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], " " AS [T+1 ], " " AS [T-1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM Bill_charge
WHERE (((Bill_charge.[Реф №])=[forms]![заказ]![ref]))
UNION ALL
SELECT Cash.[Реф №], Cash.Наименование, Cash.Дата, " " AS дата2, "  " AS [КА+1 ], " " AS [КА-1 ], " " AS [От А+1 ], " " AS [От А-1 ], round(Cash.Эквивалент1,  2 ) AS [K+ 1 ], round(Cash.Эквивалент2,  2 ) AS [K- 1 ], " " AS [Б+1 ], " " AS [Б-1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], " " AS [T+1 ], " " AS [T-1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM Cash
WHERE (((Cash.[Реф №])=[forms]![заказ]![ref]))
UNION ALL
SELECT Bank.[Реф №], Bank.Наименование, Bank.Дата1, Bank.Дата2, " " AS [КА+1 ], " " AS [КА-1 ], " " AS [От А+1 ], " " AS [От А-1 ], " " AS [K+1 ], " " AS [K-1 ], round(Bank.Эквивалент1,  2 ) AS [Б+ 1 ], round(Bank.Эквивалент2,  2 ) AS [Б- 1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], " " AS [T+1 ], " " AS [T-1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM Bank
WHERE (((Bank.[Реф №])=[forms]![заказ]![ref]))
UNION ALL
SELECT Зад_потр.[Реф №], Зад_потр.Наименование, Зад_потр.Дата1, Зад_потр.Дата2, " " AS [КА+1 ], " " AS [КА-1 ], " " AS [От А+1 ], " " AS [От А-1 ], " " AS [K+1 ], " " AS [K-1 ], " " AS [Б+1 ], " " AS [Б-1 ], round(Зад_потр.Эквивалент1,  2 ) AS [ 62 + 1 ], round(Зад_потр.Эквивалент2,  2 ) AS [ 62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], " " AS [T+1 ], " " AS [T-1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM Зад_потр
WHERE (((Зад_потр.[Реф №])=[forms]![заказ]![ref]))
UNION ALL
SELECT Зад_пост.[Реф №], Зад_пост.Наименование, Зад_пост.Дата1, Зад_пост.Дата2, " " AS [КА+1 ], " " AS [КА-1 ], " " AS [От А+1 ], " " AS [От А-1 ], " " AS [K+1 ], " " AS [K-1 ], " " AS [Б+1 ], " " AS [Б-1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], round(Зад_пост.Эквивалент1,  2 ) AS [ 61 + 1 ], round(Зад_пост.Эквивалент2,  2 ) AS [ 61 - 1 ], " " AS [T+1 ], " " AS [T-1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM Зад_пост
WHERE (((Зад_пост.[Реф №])=[forms]![заказ]![ref]))
UNION ALL
SELECT sklad.[Реф №], sklad.Наименование, sklad.Дата1, sklad.Дата2, " " AS [КА+1 ], " " AS [КА-1 ], " " AS [От А+1 ], " " AS [От А-1 ], " " AS [K+1 ], " " AS [K-1 ], " " AS [Б+1 ], " " AS [Б-1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], round(sklad.Эквивалент1,  2 ) AS [T+ 1 ], round(sklad.Эквивалент2,  2 ) AS [T- 1 ], " " AS [Рз+1 ], " " AS [Рз-1 ]
FROM sklad
WHERE (((sklad.[Реф №])=[forms]![заказ]![ref]))
UNION ALL SELECT Realization.[Реф №], Realization.Наименование, Realization.Дата1, Realization.Дата2, " " AS [КА+1 ], " " AS [КА-1 ], " " AS [От А+1 ], " " AS [От А-1 ], " " AS [K+1 ], " " AS [K-1 ], " " AS [Б+1 ], " " AS [Б-1 ], " " AS [62 + 1 ], " " AS [62 - 1 ], " " AS [61 + 1 ], " " AS [61 - 1 ], " " AS [T+1 ], "" AS [T- 1 ], round(Realization.Эквивалент1,  2 ) AS [Рз+ 1 ], round(Realization.Эквивалент2,  2 ) AS [Рз- 1 ]
FROM Realization
WHERE (((Realization.[Реф №])=[forms]![заказ]![ref]));

Этот запрос работает с приемлемой скоростью
А вот другой запрос, основанный на этом, тормозит о-о-о-очень сильно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT  "Авансы будущих периодов"  As Наименование , Sum(IIf([ 62 +]= "",0 ,[ 62 +])) - Sum(IIf([ 62 -]=" ",0 ,[ 62 -])) AS [Сумма]
FROM проводки_1
UNION ALL
SELECT "Задолженность клиента " As Наименование , Sum(IIf([КА+]="  ",0 ,[КА+])) - Sum(IIf([КА-]=" ",0 ,[КА-])) AS [Сумма]
FROM проводки_1
UNION ALL
SELECT "Товар на складе " As Наименование , Sum(IIf([T+]="  ",0 ,[T+])) - Sum(IIf([T-]=" ",0 ,[T-])) AS [Сумма]
FROM проводки_1
UNION ALL
SELECT "Плановые платежи " As Наименование , Sum(IIf([От А-]="  ",0 ,[От А-])) - Sum(IIf([От А+]=" ",0 ,[От А+])) AS [Сумма]
FROM проводки_1
UNION ALL
SELECT "Себестоимость " As Наименование , (Sum(IIf([61 +]=" ",0 ,[ 61 +])) - Sum(IIf([ 61 -]=" ",0 ,[ 61 -]))) + (Sum(IIf([T+]=" ",0 ,[T+])) - Sum(IIf([T-]=" ",0 ,[T-]))) + (Sum(IIf([От А-]=" ",0 ,[От А-])) - Sum(IIf([От А+]=" ",0 ,[От А+]))) AS [Сумма]
FROM проводки_1
UNION ALL
SELECT "Плановый доход " As Наименование , Sum(IIf([КА+]="  ",0 ,[КА+])) - Sum(IIf([От А-]=" ",0 ,[От А-])) AS [Сумма]
FROM проводки_1
UNION ALL SELECT "Реальный доход " As Наименование , Sum(IIf([Рз-]="  ",0 ,[Рз-])) - Sum(IIf([Рз+]="", 0 ,[Рз+])) AS [Сумма]
FROM проводки_1;

Возожно ли ускорить этот запрос?, т.е. я имею ввиду то, что можно ли получить такой же результат, но более оптимальным способом???
...
Рейтинг: 0 / 0
26.09.2003, 17:30
    #32277136
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость вычислений в запросе
Есть мысли
что вместо ииф-ов
было бы луче
юзать таблу-справочник
в которой
каждой проводке
сопоставлялся бы класс "авансы" ... "и т.д."

а потом ДЖОЙН справочника к данным
и счастье
...
Рейтинг: 0 / 0
26.09.2003, 17:40
    #32277149
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость вычислений в запросе
Я тут подумал, что как ни крути, а быстрее будет работать напрямую с таблицей.
Код: plaintext
1.
2.
3.
4.
SELECT  "Авансы будущих периодов"  As Наименование , 
Sum(IIf(round(Зад_потр.Эквивалент1,  2 )= "",0 ,round(Зад_потр.Эквивалент1, 
 2 ))) - Sum(IIf(round(Зад_потр.Эквивалент2,  2 )="", 0 ,round(Зад_потр.Эквивалент2,  2 ))) AS [Сумма]
FROM Зад_потр
WHERE (((Зад_потр.[Реф №])=[forms]![заказ]![ref]))

Вопрос исчерпан
...
Рейтинг: 0 / 0
26.09.2003, 17:41
    #32277150
sasha_1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость вычислений в запросе
боже мой, какой знакомый запрос
...
Рейтинг: 0 / 0
26.09.2003, 17:41
    #32277152
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость вычислений в запросе
А зачем путать типы в 1-м (т.е. преобразовывать все в строку) и требовать неявного преобразования в цифирь во втором?

Почему не Null AS [КА+1],
или CDbl(0) AS AS [КА+1],
?
и тогда iif не нужен.
если для форматирования отчетов/форм - регулируйте пустышки в 0 форматом.
...
Рейтинг: 0 / 0
26.09.2003, 17:43
    #32277157
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость вычислений в запросе
sasha_1

больная тема

assa
ща обмозгую :)
...
Рейтинг: 0 / 0
26.09.2003, 17:56
    #32277181
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость вычислений в запросе
assa
Обмозговал :)
По-моему даже медленнее стало :)
...
Рейтинг: 0 / 0
26.09.2003, 17:58
    #32277185
sasha_1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость вычислений в запросе
как сейчас помню, что на подобное восклицание с моей стороны,
Всеволод ответил примерно следующее:
"Не хочу чтоб вся таблица была в ноликах, хочу, чтоб поля были просто
пустыми"
собственно поэтому и был придуман изврат с iif isnull
...
Рейтинг: 0 / 0
26.09.2003, 17:59
    #32277189
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость вычислений в запросе
Код: plaintext
1.
2.
3.
4.
SELECT  "Авансы будущих периодов"  AS Наименование, 
Sum(IIf(round([Зад_потр].[Эквивалент1], 2 )= "",0 ,round([Зад_потр].[Эквивалент1], 2 )))
-Sum(IIf(round([Зад_потр].[Эквивалент2], 2 )="", 0 ,round([Зад_потр].[Эквивалент2], 2 ))) AS Сумма
FROM Зад_потр
WHERE ((([Зад_потр].[Реф №])=[forms]![заказ]![ref]));

Хм... Если поле Эквивалент2 - пустое, то поле Сумма не вычисляется - это косяк :)
...
Рейтинг: 0 / 0
26.09.2003, 18:02
    #32277194
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость вычислений в запросе
sasha_1
Согласен Одно лечим другое колечим
...
Рейтинг: 0 / 0
26.09.2003, 18:10
    #32277210
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость вычислений в запросе
Туплю я однако :)
Вот так работает:
Код: plaintext
1.
2.
3.
4.
SELECT  "Авансы будущих периодов"  AS Наименование, 
Sum(NZ(round([Зад_потр].[Эквивалент1], 2 ), 0 )) 
-Sum(NZ(round([Зад_потр].[Эквивалент2], 2 ), 0 )) AS Сумма
FROM Зад_потр
WHERE ((([Зад_потр].[Реф №])=[forms]![заказ]![ref]));
...
Рейтинг: 0 / 0
26.09.2003, 18:25
    #32277220
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость вычислений в запросе
Медленнее с CDbl(0) или c Null?

____
ЗЫ (Help):
>>Используйте псевдонимы только в первом предложении SELECT, потому что в остальных они пропускаются
(это к слову)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Скорость вычислений в запросе / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]