Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
HowTo: Release a Table variable
Message
De
13/01/2005 19:02:43
 
 
À
12/01/2005 18:03:18
Information générale
Forum:
Microsoft SQL Server
Catégorie:
Autre
Divers
Thread ID:
00976391
Message ID:
00977003
Vues:
30
>Fabio,
>
>I honestly do not have an answer as to "why" - whether it was an architectural issue, or something completely different.
>
>All I can tell you is that you cannot drop a table variable when it is no longer necessary. It simply goes out of scope when the proc completes.
>
>It seems you can do a DELETE FROM @tTableVar at any time, though I have no idea if that would have the desired effect on resource usage.
>
> Someone must tell me why not there is RELEASE @table.
>If I had implemented DECLARE @table TABLE,
>after a second I would have implemented RELEASE @Table.
>Simple very simple.

>
>I think it's simple/easy to say that... ;)
>
>Kevin

I have investigated on DELETE @tTableVar, because it did not convince to me.
Infact!
Try this into a SINGLE USER MSSQL.
use tempdb
SET NOCOUNT ON
DBCC SHRINKDATABASE (tempdb, 0)
SELECT TempDataSize = TD.F,TempLogSize = TL.F FROM
 (SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) = 0) TD
,(SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) <> 0) TL
SELECT GETDATE()
declare @table TABLE (f1 CHAR(8000) NULL)
insert into @table values('')
declare @i INT
select @i=0
while @i<12
   begin
    insert into @table SELECT*FROM @table
    select @i=@i+1
  end
SELECT TempDataSize = TD.F,TempLogSize = TL.F FROM
 (SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) = 0) TD
,(SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) <> 0) TL
SELECT GETDATE()
-- with go release the variables
go
SELECT 'end after release',GETDATE()
SELECT TempDataSize = TD.F,TempLogSize = TL.F FROM
 (SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) = 0) TD
,(SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) <> 0) TL
RETURN
-- on my pc:
-- total   time =  37s
-- release time =  60ms
-- tempdb size increment = data : 50624-8192=33280 KB  Log : 20096-512 = 19584 KB
This uses DELETE
use tempdb
SET NOCOUNT ON
DBCC SHRINKDATABASE (tempdb, 0)
SELECT TempDataSize = TD.F,TempLogSize = TL.F FROM
 (SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) = 0) TD
,(SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) <> 0) TL
-- Now redo the operation with delete @table
declare @table TABLE (f1 CHAR(8000) NULL)
insert into @table values('')
declare @i INT
select @i=0
while @i<12
   begin
    insert into @table SELECT*FROM @table
    select @i=@i+1
  end
SELECT TempDataSize = TD.F,TempLogSize = TL.F FROM
 (SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) = 0) TD
,(SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) <> 0) TL
SELECT GETDATE()
DELETE @table
SELECT 'end after release',GETDATE()
SELECT TempDataSize = TD.F,TempLogSize = TL.F FROM
 (SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) = 0) TD
,(SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) <> 0) TL
RETURN
-- total   time = 54s
-- delete  time = 16s  and a Log increment of 56MB !!!!
-- tempdb size increment = data : 50624-8192=33280 KB  Log : 76736-512 = 76224 KB !!!!!!
This uses a temporary table with DROP
use tempdb
SET NOCOUNT ON
DBCC SHRINKDATABASE (tempdb, 0)
SELECT TempDataSize = TD.F,TempLogSize = TL.F FROM
 (SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) = 0) TD
,(SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) <> 0) TL
SELECT GETDATE()
create table #table ( f1 CHAR(8000) NULL)
insert into #table values('')
declare @i INT
select @i=0
while @i<12
   begin
    insert into #table SELECT * FROM #table
    select @i=@i+1
  end
SELECT TempDataSize = TD.F,TempLogSize = TL.F FROM
 (SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) = 0) TD
,(SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) <> 0) TL
SELECT GETDATE()
DROP TABLE #table
SELECT 'end after release',GETDATE()
SELECT TempDataSize = TD.F,TempLogSize = TL.F FROM
 (SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) = 0) TD
,(SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) <> 0) TL
RETURN
-- total   time = 37s
-- drop    time = 10ms
-- tempdb size increment = data : 50624-8192=33280 KB  Log : 20096-512 = 19584 KB
This uses a temporary table with DELETE
use tempdb
SET NOCOUNT ON
DBCC SHRINKDATABASE (tempdb, 0)
SELECT TempDataSize = TD.F,TempLogSize = TL.F FROM
 (SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) = 0) TD
,(SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) <> 0) TL
SELECT GETDATE()
create table #table ( f1 CHAR(8000) NULL)
insert into #table values('')
declare @i INT
select @i=0
while @i<12
   begin
    insert into #table SELECT * FROM #table
    select @i=@i+1
  end
SELECT TempDataSize = TD.F,TempLogSize = TL.F FROM
 (SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) = 0) TD
,(SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) <> 0) TL
SELECT GETDATE()
DELETE #table
SELECT 'end after delete #table',GETDATE()
SELECT TempDataSize = TD.F,TempLogSize = TL.F FROM
 (SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) = 0) TD
,(SELECT size*8 F FROM dbo.sysfiles WHERE (status & 0x40) <> 0) TL
DROP TABLE #table
RETURN
-- total   time = 37s
-- drop    time = 16s
-- tempdb size increment = data : 50624-8192=33280 KB  Log : 76736-512 = 76224 KB  This is expected
You see that a go free the @TableVar in a flash, and free the Tempdb allocated pages.

You known an explanation, or can speak with some "expert!?" who can tell me
why the operations into the @TableVar are logged ?
When SQL execute DELETE @Table, it copy the @Table into the Log file. Why ?
How can i rollback @Tablevar ?

Fabio
Précédent
Répondre
Fil
Voir

Click here to load this message in the networking platform