t-sql: différence de performance entre le slider et le slider statique

J'ai deux scripts simples L'un est:

declare @active_from date = '01.03.2014' declare @active_to date = '01.04.2014' declare @house_id integer = 11927 ---- declare @service_id integer declare @addendum_id integer declare @activity_id integer declare @session_id integer declare @cur_active_from datetime declare @cur_active_to datetime declare @session_license_fee_cur cursor -- prepare cursor set @session_license_fee_cur = cursor static for select activity_id , addendum_id , service_id , active_from , active_to from dbo.bills_supp_get_activate_license_fee_for_sessions_by_house(@active_from, @active_to, @house_id) -- open cursor open @session_license_fee_cur fetch next from @session_license_fee_cur into @activity_id, @addendum_id, @service_id, @cur_active_from, @cur_active_to while (@@FETCH_STATUS = 0) begin -- get next record fetch next from @session_license_fee_cur into @activity_id, @addendum_id, @service_id, @cur_active_from, @cur_active_to end -- close @session_license_fee_cur deallocate @session_license_fee_cur 

Ça marche less d'une seconde. Le second est le même, mais à la place

 set @session_license_fee_cur = cursor static for 

j'utilise

 set @session_license_fee_cur = cursor for 

Sans "statique". Cela fonctionne plus de 1 minute. Pourquoi une telle différence de performance? L'logging de count dans la requête est d'environ 3000

Curseur statique, la requête est exécutée, le résultat est stocké dans tempdb, puis vous parcourez.

Donc, fondamentalement, il s'agit d'une copy en lecture seule, pas besoin de synchroniser avec datatables sous-jacentes, donc pas besoin de verrous et autres.

Je ne me suis pas rendu count que cela avait un gros frais, là encore, je me suis efforcé de ne pas utiliser de sliders, sauf pour les tâches d'administration.