SQL geek, Data enthusiast, Consultant & Developer
Latest posts by Adrian Chodkowski (see all)
Wraz z technologią In-memory OLTP wprowadzone zostały dwa nowe indeksy tj. HASH Index oraz NONCLUSTERED Index. Każdy z nich znacznie różni się od tego co mieliśmy do dyspozycji wcześniej i ma jasno sprecyzowane scenariusze użycia. W ramach niniejszego artykułu chciałbym przedstawić Wam koncepcje pierwszego ze wspomnianych indeksów tj. HASH oraz to w jakich przypadkach może on okazać się dla Was użyteczny. Zacznijmy od stworzenia zestawu danych na którym będziemy pracować:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
--check if database exists DROP DATABASE IF EXISTS Hekaton_Demo GO --create database CREATE DATABASE [Hekaton_demo] ON PRIMARY ( NAME = N'Hekaton_demo', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Hekaton_demo.mdf' , SIZE = 524288KB , FILEGROWTH = 65536KB ) LOG ON ( NAME = N'Hekaton_demo_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Hekaton_demo_log.ldf' , SIZE = 131072KB , FILEGROWTH = 65536KB ) GO --add special filegroup to database ALTER DATABASE Hekaton_demo ADD FILEGROUP AWMemGroup CONTAINS MEMORY_OPTIMIZED_DATA GO --add "file" to filegroup ALTER DATABASE [Hekaton_demo] ADD FILE ( NAME = N'Hekaton_demo_inmem', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Hekaton_demo_inmem' ) TO FILEGROUP [AWMemGroup] GO |
Następnie stwórzmy sobie tabelę wraz z interesującym nas indeksem i wypełnijmy ją 100 tysiącami rekordów :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
CREATE TABLE dbo.HK_Indexes ( Id1 int, Id2 int, CreatedDate datetime, CONSTRAINT PK_ID PRIMARY KEY NONCLUSTERED HASH (Id1,Id2) WITH (BUCKET_COUNT=400000) ) WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY) GO DECLARE @Counter INT=0 DECLARE @NoOfRows INT=100000 WHILE @Counter<=@NoOfRows BEGIN INSERT dbo.HK_Indexes(Id1,Id2,CreatedDate) VALUES ( @Counter ,CAST(RAND()*10000 AS INT) ,DATEADD(DAY,-CAST(RAND()*1000 AS INT),GETDATE())) SET @Counter=@Counter+1 END GO |
Jak możecie zauważyć wskazaliśmy, że interesuje nas indeks hash poprzez wskazanie NONCLUSTERED…
Read more