About Me

My photo
Mumbai, Maharastra, India
He has more than 7.6 years of experience in the software development. He has spent most of the times in web/desktop application development. He has sound knowledge in various database concepts. You can reach him at viki.keshari@gmail.com https://www.linkedin.com/in/vikrammahapatra/ https://twitter.com/VikramMahapatra http://www.facebook.com/viki.keshari

Search This Blog

Friday, December 30, 2011

BATCH UPDATE IN SQL SERVER. A much relif for those who are working with Production server

BATCH UPDATE  IN SQL SERVER. A much relif for those who are working with Production server

During my deputation to Onsite, once I experienced a situation where a table from the PRODUCTION/LIVE DB needs an updation for a particular column value.

I remember a situation where where a junior SQL devloper execute update statement on that table which contain data in GBs. As a result of that update statement every thing get stopped.

Those of us, who work in the Production / Live DB, know the pain, of firing an update query on a huge table. This is very problematic as this will lead to the following

  • The entire table will be locked by your application , so other users /  application will not be able to perform the DDL on this table
  •  The TempDB will grow huge
  •  A update lock on a table will stop other users , for making changes in the table.

So what is option to resolve this issue?

I create a solution where I am updateing a table with Active cloumn TRUE where ever it gets ‘FALSE’ value in the column.

For demostration purpose our table contain 10 record with the Active column value ‘FALSE’ and we are updating 2 record at a time. So the batch size of updation in our example is 2. U can set your own value depending upon your application useage.

select * from user_tab where active = 'False'
user_id     user_name                                          active
----------- -------------------------------------------------- ------
1           Kruthika                                           0
2           Orpita                                             0
3           Aalap                                              0
4           Trishona                                           0
5           Shobna                                             0
6           Eekalabya                                          0
7           Fani                                               0
8           Kishalaya                                          0
9           Mrinmoy                                            0
10          Satyajit                                           0

(10 row(s) affected)


And we are updating the FALSE value of Active column to TRUE. But here we are updating two record at a time.

declare @cnt int
declare @total_record int
declare @row_processed int
declare @row_count int

select @cnt = 1
select @row_processed = 0
select @total_record=count(*) from parent_tab

while ( @cnt > 0)
begin
      set rowcount 2
      update user_tab
      set active = 'True'
      where active = 'False'

      select @row_count = @@rowcount
     
      if(@row_count = 0)
      begin
            select @cnt = 0
      end        
      else
      begin
            select @row_processed = @row_processed + @row_count
            print 'The total number of rows effected :'+convert(varchar,@row_processed)
      end
end

print 'Update complete'
set rowcount 0

//OUTPUT OF SCRIPT

(2 row(s) affected)
The total number of rows effected :2

(2 row(s) affected)
The total number of rows effected :4

(2 row(s) affected)
The total number of rows effected :6

(2 row(s) affected)
The total number of rows effected :8

(2 row(s) affected)
The total number of rows effected :10

(0 row(s) affected)
Update complete

After execution of this script the result of the table is as follows

select * from user_tab where active = 'False'
user_id     user_name                                          active
----------- -------------------------------------------------- ------

(0 row(s) affected)

So we can see there is no record with ACTIVE column value ‘FALSE’. Let’s check for ACTIVE = ‘TRUE’


select * from user_tab where active = 'True'

user_id     user_name                                          active
----------- -------------------------------------------------- ------
1           Kruthika                                           1
2           Orpita                                             1
3           Aalap                                              1
4           Trishona                                           1
5           Shobna                                             1
6           Eekalabya                                          1
7           Fani                                               1
8           Kishalaya                                          1
9           Mrinmoy                                            1
10          Satyajit                                           1

(10 row(s) affected)

So all records gets updated with ACTIVE status sets to ‘TRUE’.

If you find any problem in understanding this code, revert me at viki.keshari@gmail.com


No comments:

Post a Comment