我在SQL Server 2014中有一个表,如下所示:
CREATE TABLE dbo.MyTable
(
[id1] [bigint] NOT NULL,
[id2] [bigint] NOT NULL,
[col1] [int] NOT NULL default(0),
[col2] [int] NOT NULL default(0)
)
(id1,id2)是PK。基本上,id1是将一组结果(id2,col1,col2)分组的标识符,其pk为id2。
我正在尝试使用内存表来摆脱现有的基于磁盘的表,这是我的瓶颈。
- 表中的数据被写入->读取->删除一次。
- 每个id1值都有数千个id2(成百上千)。
- 数据在表中存储的时间非常短,例如20秒。
在此表上执行的查询如下:
-- INSERT (can vary from 10s to 10,000s of records):
INSERT INTO MyTable
SELECT @fixedValue, id2, col1, col2 FROM AnotherTable
-- READ:
SELECT id2, col1
FROM MyTable INNER JOIN OtherTbl ON MyTable.id2 = OtherTbl.pk
WHERE id1 = @value
ORDER BY col1
-- DELETE:
DELETE FROM MyTable WHERE id1 = @value
这是我用于表格的当前定义:
CREATE TABLE dbo.SearchItems
(
[id1] [bigint] NOT NULL,
[id2] [bigint] NOT NULL,
[col1] [int] NOT NULL default(0),
[col2] [int] NOT NULL default(0)
CONSTRAINT PK_Mem PRIMARY KEY NONCLUSTERED (id1,id2),
INDEX idx_Mem HASH (id1,id2) WITH (BUCKET_COUNT = 131072)
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
不幸的是,与基于磁盘的表的先前情况相比,此定义导致性能下降。数量级大约高出10%(在某些情况下达到100%,因此是两倍时间)。
最重要的是,考虑到Microsoft宣传的无锁体系结构,我期望在高并发方案中获得超级优势。相反,最糟糕的性能恰好是当有多个并发用户在表上运行多个查询时。
问题:
- 正确设置的BUCKET_COUNT是什么?
- 我应该使用哪种索引?
- 为什么性能要比基于磁盘的表差?
sys.dm_db_xtp_hash_index_stats的查询返回:
total_bucket_count = 131072 empty_bucket_count = 0 avg_chain_len = 873 max_chain_length = 1009
我更改了存储区计数,因此sys.dm_db_xtp_hash_index_stats的输出为:
total_bucket_count = 134217728 empty_bucket_count = 131664087 avg_chain_len = 1 max_chain_length = 3
即便如此,结果仍然几乎相同。
select * from sys.dm_db_xtp_hash_index_stats
吗?:另外,此链接应该回答大多数/所有的问题msdn.microsoft.com/en-us/library/...
OPTION(OPTIMIZE FOR UNKNOWN)
(请参阅表提示)?