Why is the query on the "in-memory" table with the "native compiled" stored proc, slower than the equivalent on disk?Tnx.[code="sql"]USE master;-- Create databaseCREATE DATABASE InMemoryON PRIMARY(NAME = InMemoryData,FILENAME = 'f:\MSSQL\data\InMemoryData.mdf', SIZE=200MB),-- Memory Optimized DataFILEGROUP [InMem_FG] CONTAINS MEMORY_OPTIMIZED_DATA(NAME = [InMemory_InMem_dir],FILENAME = 'f:\MSSQL\data\InMemory_InMem_dir')LOG ON (name = [InMem_demo_log], Filename='f:\MSSQL\data\InMemory.ldf', SIZE=100MB)GO-- Create tableUSE InMemoryGO-- Create a Simple TableCREATE TABLE dbo.DummyTable (ID INT NOT NULL PRIMARY KEY,Name VARCHAR(100) NOT NULL,INDEX IdxName (Name))GO-- Create a Memory Optimized TableCREATE TABLE dbo.DummyTable_Mem (ID INT NOT NULL,Name VARCHAR(100) COLLATE Latin1_General_BIN2 NOT NULL,INDEX IdxName (Name),CONSTRAINT ID_Clust_DummyTable_Mem PRIMARY KEY NONCLUSTERED HASH (ID) WITH (BUCKET_COUNT=1000000)) WITH (MEMORY_OPTIMIZED=ON)GO-- Create stored procedure to insrt 100,000 rows.CREATE PROCEDURE Simple_Insert_testAS BEGIN SET NOCOUNT ON DECLARE @counter AS INT = 1DECLARE @start DATETIME SELECT @start = GETDATE()WHILE (@counter <= 100000)BEGIN INSERT INTO dbo.DummyTable SELECT @counter, 'On disk test '+CONVERT(VARCHAR(21),GETDATE(),121) SET @counter = @counter + 1END SELECT DATEDIFF(SECOND, @start, GETDATE() ) [Simple_Insert IN sec]ENDGO-- Inserting same 100,000 rows using InMemory TableCREATE PROCEDURE dbo.InMemory_Insert_testWITH NATIVE_COMPILATION, SCHEMABINDING,EXECUTE AS OWNERAS BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL=SNAPSHOT, LANGUAGE='english')DECLARE @counter AS INT = 1DECLARE @start DATETIME SELECT @start = GETDATE()WHILE (@counter <= 100000)BEGIN INSERT INTO dbo.DummyTable_Mem SELECT @counter, 'In-Memory test '+CONVERT(VARCHAR(21),GETDATE(),121) SET @counter = @counter + 1END SELECT DATEDIFF(SECOND, @start, GETDATE() ) [InMemory_Insert IN sec]ENDGO-- Create procedure to quuery some data.CREATE PROCEDURE Simple_Query_testASBEGINSET NOCOUNT ONDECLARE @start DATETIMESELECT @start = GETDATE()SELECT MIN(id) AS MinID,MAX(id) AS MaxID FROM dbo.DummyTableSELECT DATEDIFF(ms, @start, GETDATE() ) [Disk_Query IN ms]SELECT @start = GETDATE()SELECT MIN(Name) AS MinName,MAX(Name) AS MaxName FROM dbo.DummyTableSELECT DATEDIFF(ms, @start, GETDATE() ) [Disk_Query IN ms]ENDGOCREATE PROCEDURE dbo.InMemory_Query_testWITH NATIVE_COMPILATION, SCHEMABINDING,EXECUTE AS OWNERASBEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL=SNAPSHOT, LANGUAGE='english')DECLARE @start DATETIME, @MinName VARCHAR(100), @MaxName VARCHAR(100)SELECT @start = GETDATE()SELECT MIN(id) AS MinID,MAX(id) AS MaxID FROM dbo.DummyTable_MemSELECT DATEDIFF(ms, @start, GETDATE() ) [InMemory_Query IN ms]SELECT @start = GETDATE()--select MIN(Name) AS MinName,MAX(Name) AS MaxName from dbo.DummyTable_MemSELECT TOP 1 @MinName=Name FROM dbo.DummyTable_Mem ORDER BY name ASCSELECT TOP 1 @MaxName=Name FROM dbo.DummyTable_Mem ORDER BY name DESCSELECT @MinName, @MaxNameSELECT DATEDIFF(ms, @start, GETDATE() ) [Disk_Query IN ms]ENDGO-- Running the test for InsertEXEC Simple_Insert_testGOEXEC dbo.InMemory_Insert_testGO-- Running the test for QueryEXEC Simple_Query_testGOEXEC dbo.InMemory_Query_testGO-- Cleanup database.USE master;DROP DATABASE InMemoryGO[/code]
↧