2013-07-27 2 views
-1

Update table Data without using while loop in sql server 2005Улучшенная производительность для вычисления текущего итога операции в SQL Server 2005

я задал этот вопрос и детали ....

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

id  type  amount  
1  type1  2000  
2  type1  1000  
3  type2  500  
4  type3  3000  
5  type1  2000 
6  type2  500   
7  type3  5000  
8  type1  1000  

и Я хочу получить данные в выписке, как показано ниже

id  type  amount  current 
1  type1  2000   2000     
2  type1  1000   1000     
3  type2  500   500     
4  type3  3000   3000     
5  type1  2000   3000     
6  type2  -500   0     
7  type3  5000   2000 
8  type1  -1000   4000 

a й так далее , что означает, что каждый тип должен иметь свою текущую общую сумму в зависимости от суммы типа и его потребности быть не имеет в то время как петли, так как это занимает много времени, чтобы выполнить

for eg: 

in type 1 

ID  Amount  current 
1  2000-add  2000     
2  1000-sub  1000     
3  2000-add  3000     
4  1000-add  4000     

и ответ,

SELECT id, 
     type, 
     amount, 
     (SELECT sum(amount) 
     FROM mytable t1 
     WHERE t1.type = t2.type 
       AND t1.id <= t2.id) currenttotal 
FROM mytable t2 

Теперь проблема в том, предположим, вышеприведенный пример есть 8000 (это увеличит) записи данных, как

id  type  amount  
1  type1  2000  
2  type1  1000  
3  type2  500  
4  type3  3000  
5  type1  2000 
6  type2  500   
7  type3  5000  
8  type1  1000 

и его взять 00:00:02 время для выполнения оператора select, которое я написал на основе ответа (у вас есть 2 ответа и оба имеют одинаковое время выполнения) для вышеуказанного вопроса. Как уменьшить это время выполнения?

+0

* Как уменьшить это время выполнения? * У вас есть индексы для поддержки запроса? Я предполагаю, что вы хотя бы посмотрели на план исполнения. –

+0

Downvoted, пожалуйста, добавьте более подробную информацию. – Namphibian

+0

Соответствующий индекс для этого запроса: 'type, id INCLUDE (amount)', хотя если у вас много строк на производительность 'type', все равно будет плохо. –

ответ

2

Попробуйте

CREATE UNIQUE INDEX IX ON YourTable(type,id) INCLUDE (amount) 

Пока число строк на type не слишком большой запрос в вашем вопросе должно быть в порядке.

SQL Server 2012 имеет лучшую поддержку для расчета текущих сумм, чем предыдущие версии. В SQL Server 2012 вы можете просто сделать

SELECT id, 
     type, 
     amount, 
     SUM(amount) OVER (PARTITION BY type 
         ORDER BY id ROWS UNBOUNDED PRECEDING) currenttotal 
FROM mytable t2 
+0

, пожалуйста, объясните больше и укажите пример с приведенными выше данными ... пожалуйста – Suresh

+0

@Suresh - Мое предложение - создать индекс на вашем столе. На самом деле нет примера, который я могу вам дать. Первая строка кода в моем ответе - полный синтаксис для этого. Создание индекса, мы надеемся, означает, что ваш существующий запрос будет работать в приемлемое время. –

+0

'UNBOUNDED PRECEDING' означает? – Suresh

 Смежные вопросы

  • Нет связанных вопросов^_^