[SQL SERVER]善用 In-Memory 資料表變數提高效能

如果您使用暫存資料表、資料表變數或資料表值參數,

可以考慮轉換記憶體資料表變數來提升效能。

In-Memory OLTP 可大幅提升交易處理、資料擷取和資料載入的效能。

SQL Server 2016 對In-Memory OLTP 有一些改善。

如針對記憶體資料表和原生編譯預存程序支援ALTER,讓維護資料表或程式更容易..等。

 

記憶體資料表變數的優點

1.不使用tempdb資源,如有嚴重的tempdb資源競爭,可有效解決

2.沒有任何IO活動

3.沒有任何latch or lock

 

記憶體資料表變數的耗用量

1.維持窄的索引鍵,避免耗用過多記憶體

2.資料表變數脫離範圍,將自動釋放記憶體

Note:大索引一定要注意記憶體是否足夠

/*
RiCo 技術農場
https://dotblogs.com.tw/ricochen

SQL Server 2016: 善用 In-Memory 資料表變數提高效能
*/
   
--disk base Table var
alter proc usp_disktv(@maxloop int)
as
set nocount on
declare @i int=0;
declare @disktablevar table
(
c1 int identity(1,1) primary key nonclustered(c1) ,
c2 varchar(30),
c3 int
)

while(@i <@maxloop)
begin

insert into  @disktablevar (c2,c3)
select top 12 [Date Key],[Stock Item Key]
from Fact.Movement

set @i+=1;
end

exec usp_disktv 500
    
--memory base Table var
create type mytable as table
(
c1 int identity(1,1) primary key nonclustered(c1) ,--The memory optimized table must have at least one index
c2 varchar(30),
c3 int
)
with(memory_optimized=on)	
	
alter proc usp_memorytv(@maxloop int)
as
set nocount on
declare @i int=0;
declare @memorytablevar mytable;

while(@i <@maxloop)
begin

insert into @memorytablevar (c2,c3)
select top 12 [Date Key],[Stock Item Key]
from Fact.Movement  

set @i+=1;
end

exec usp_memorytv 500
	
--check wait type
select a.session_id,a.command,a.status,a.wait_time,a.wait_type,a.wait_resource,a.writes,b.program_name
from sys.dm_exec_requests a join sys.dm_exec_sessions b
on a.session_id=b.session_id
where a.session_id>50 and b.program_name=N'SQLQueryStress'

--kill spid
declare @DatabaseName nvarchar(50)
set @DatabaseName = N'WideWorldImportersDW'

declare @SQL varchar(max)

select @SQL = COALESCE(@SQL,'') + 'Kill ' + Convert(varchar, SPId) + ';'
from MASTER..SysProcesses
where DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId and program_name=N'SQLQueryStress'

--select @SQL 
exec(@SQL)

 

參考

In-Memory OLTP (In-Memory Optimization)

Memory-Optimized Table Variables

Faster temp table and table variable by using memory optimization