Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2022, 17:13   #1
DenisG
Новичок
Джуниор
 
Регистрация: 13.10.2022
Сообщений: 1
По умолчанию Оконные функции и длина строки

Имеется сложный результирующий SQL запрос, являющийся по сути неким вычисляющим и агрегирующим значения отчетом вида
Код:
SELECT RowNumber, колонка1, колонка2,
	CASE Calculated WHEN 0 THEN T1.[Today] 
	ELSE
		CASE RowNumber
			WHEN 7 THEN CAST(LAG([Today], 4) OVER (ORDER by RowNumber) / NULLIF(LAG([Today], 1) OVER (ORDER by RowNumber) , 0) * 100 AS DECIMAL(20,8)) 
                         ... еще много таких строк ...
		END
	END AS [Today] ,
        ... еще несколько подобных колонок ...
	FROM ...основной запрос...
Всего колонок верхнего уроня порядка десяти, и они почти все числовые, т.е. превышением длины одной строки тут и не пахнет
однако про большом количестве строк выполнение запроса падает с ошибкой
The query processor is unable to produce a plan because a worktable is required, and its minimum row size exceeds the maximum allowable of 8060 bytes. A typical reason why a worktable is required is a GROUP BY or ORDER BY clause in the query.

По результатам исследований выяснилось что на размер строки влияют только условия WHEN в которых присутствуют функции LAG и LEAD. Хотя, по здравому смыслу, для каждой одной строки со своим RowNumber должно выбираться только одно соответствие условию WHEN, и игнорироваться остальные. Но нет, каким то образом длина строки растет именно пропорционально количеству WHEN, в которых присутствуют оконные функции, даже если RowNumber, являющийся условием WHEN, для этих строк не совпадает. И строка с номером RowNumber = 1 падает из-за превышения длины где то в конструкции CASE RowNumber. Что еще бредовее - падение наступает еще быстрее (при меньшем количество WHEN-ов) если в оконных функциях третьим параметром указывать дефолтное значение.

Вопрос - кто-нибудь понимает как работает сиквел с данными оконными функциями? Почему они увеличивают длину строки даже в тех случаях, когда вообще не должны выполняться (отсекаются по несовпадению WHEN)?
DenisG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оконные функции Svetlana1111 SQL, базы данных 1 24.05.2022 13:18
Длина строки AlexDn Общие вопросы Delphi 3 13.08.2018 02:06
Matlab прямоугольные оконные функции Zema92 Помощь студентам 0 17.05.2014 19:46
Длина строки С++ ArniLand Общие вопросы C/C++ 7 25.03.2010 10:59
обновление в блоге - Хуки в Windows. Часть третья. Оконные функции Pblog Обсуждение статей 1 04.01.2010 13:20