Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Эта задача решается быстрее на Oracle, чем на MS SQL
зачем так много вариантов перебиратьКогда запрос выполняется 5 секунд, его, разумеется, никто не станет оптимизировать.
и сравнивать сервераПросто есть опыт 4.5 года и на MS SQL, запустил и там. Цели «сравнить» не было
посмотрел код на MSSQL — мне кажется там много где можно докрутитьВозможно код, возможно сервер, но кроме оконных функций
Оконные функции использовать можно в подобных запросахУбедил. Я написал вариант WIND для двух движков. Но чтобы его протестировать на производительность нужно время. Наверное, в выходные. Ранее меня пугало слово distinct, я считал, что это будет лишний шаг. Если получу удовлетворительные результаты — я добавлю в пост в пул вариантов с указанием ссылки на тебя. Годится? Или можешь опубликовать его здесь сам.
Скорее всего на практике вам не потребуются все данные, а только определённый объёмТут, также как в DWH. Действительно, в каждый конкретный момент времени нам требуется небольшой кусочек данных, но за день окажется что мы опросили большую часть всего объёма, и некоторые части — многократно (и многократно же их рассчитывали). Чтобы не тратить время на многократный расчёт — мы загружаем в хранилище все данные, за весь период, и рассчитав однократно.
как может вариант, где всё заранее посчитано и сложено в таблицу медленнее какого-то другого?Почему? Он не медленнее, он быстрее всего на MS SQL.
достаточно просто min(ID) сделатьЭто моя ошибка. Я исправлю. Просто ранее это поле называлось не ID, а SEQ_NUM, и в нём хранился порядковый номер транзакции внутри секунды. Там окна 10^6 было с запасом. Но потом я отказался от этого поля, потому что требовался дополнительный оператор, который пройдёт по всей таблице и заполнит это поле на основании ID
DECLARE @STRIPE_ID int = 5
SELECT dbo.UT2DATESTR(UT), *
FROM (
SELECT STRIPE_ID = @STRIPE_ID,
STOCK_NAME,
dbo.TRUNC_UT(UT, @STRIPE_ID) AS UT,
AOPEN = FIRST_VALUE(APRICE) OVER (PARTITION BY dbo.TRUNC_UT(UT, @STRIPE_ID) ORDER BY UT),
ACLOSE = LAST_VALUE(APRICE) OVER (PARTITION BY dbo.TRUNC_UT(UT, @STRIPE_ID) ORDER BY UT RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING),
AMAX = MAX(APRICE) OVER (PARTITION BY dbo.TRUNC_UT(UT, @STRIPE_ID) ORDER BY UT RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING),
AMIN = MIN(APRICE) OVER (PARTITION BY dbo.TRUNC_UT(UT, @STRIPE_ID) ORDER BY UT RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING),
SORT = ROW_NUMBER() OVER (PARTITION BY dbo.TRUNC_UT(UT, @STRIPE_ID) ORDER BY UT ASC),
CNT = COUNT(*) OVER (PARTITION BY dbo.TRUNC_UT(UT, @STRIPE_ID)),
APRICE
FROM TRANSACTIONS_RAW) x
WHERE x.SORT = 1
Прореживание таймфреймов (криптовалюты, форекс, биржи)