Самый быстрый способ выполнения среднего времени нескольких вычислений в SQL? - PullRequest
1 голос
/ 20 сентября 2010

У меня есть вопрос о самом быстром способе выполнения запроса SQL Server к таблице, TheTable, которая имеет следующие поля: TimeStamp, Col1, Col2, Col3, Col4
Я не поддерживаю базу данных, япросто могу получить к нему доступ.Мне нужно выполнить 10 расчетов, которые похожи на:

Col2*Col3 + 5       
5*POWER(Col3,7) + 4*POWER(Col2,6) + 3*POWER(Col1,5)       

Затем я должен найти AVG и MAX результатов расчета, используя данные за выбранный день (в базе данных есть 8 месяцев данных, поэтомудалеко).Поскольку данные отбираются каждые 0,1 секунды, 864000 строк входят в каждый расчет.Я хочу убедиться, что запрос выполняется как можно быстрее.Есть ли лучший способ, чем это:

SELECT AVG(Col2*Col3 + 5), 
    AVG(5*POWER(Col3,7) + 4*POWER(Col2,6) + 3*POWER(Col1,5)), 
    MAX(Col2*Col3 + 5), 
    MAX(5*POWER(Col3,7) + 4*POWER(Col2,6) + 3*POWER(Col1,5)) 
FROM TheTable 
WHERE TimeStamp >= '2010-08-31 00:00:00:000' 
    AND TimeStamp < '2010-09-01 00:00:00:000'

Спасибо!

Ответы [ 3 ]

2 голосов
/ 20 сентября 2010

Вы можете создать их как вычисленные (вычисленные) столбцы и установить для Is Persisted значение true.Это сохранит вычисленное значение на диске при вставке и очень быстро выполнит последующие запросы к этим значениям.

Альтернативно, если вы не можете изменить схему таблицы, вы можете создать индексированное представление ,рассчитывает значения для вас.

0 голосов
/ 20 сентября 2010

Ваша единственная ставка - заранее рассчитать значения: Вычисляемые столбцы или постоянные столбцы в представлении, см. Здесь Повышение производительности с помощью индексированных представлений SQL Server 2005 . Если вы не можете изменить базу данных, вы можете извлечь данные из этой базы данных в свою базу данных. Просто вычислите столбцы, вставляя их в свою базу данных. Затем запустите ваши запросы из вашей собственной базы данных.

0 голосов
/ 20 сентября 2010

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

TableName
---------
 TimeStamp
 Col1
 Col2
 Col3
 Col4
 Calc1
 Calc2
 Calc3

и вставить вот так:

INSERT INTO TableName (...)
VALUES
(...,AVG(@Col2Val*@Col3Val + 5),...)
...