如果您使用暫存資料表、資料表變數或資料表值參數,
可以考慮轉換記憶體資料表變數來提升效能。
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