2010-09-20 3 views
1

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

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' 

Спасибо!

ответ

2

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

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

+0

Я новичок в SQL - будут ли эти столбцы стать постоянной частью таблицы? Я должен был упомянуть, что это база данных, которую я не поддерживаю. – KAE

+0

Да, они будут. Смотрите мое второе предложение. – RedFilter

+0

Большое спасибо. Как только я узнаю, как сделать Indexed View, я отправлю код. – KAE

0

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

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

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

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

Это отличное предложение, но я должен был упомянуть, что на самом деле это не моя база данных, поэтому я не уверен, что менеджер базы данных хочет, чтобы я ее изменил. Также расчеты меняются довольно часто. – KAE

+0

Хорошо, если вам нужно сделать расчеты, вы должны сделать расчеты. Если вы не можете сделать это на вставке, ваши варианты должны сделать это при выборе или сделать это в коде после того, как вы выбрали все. –

0

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