尝试制定SQL Server 2014内存优化表的方法
一个非常简单的表是应用程序中最活跃的表
表
int PK1
int PK2
composite clustered PK of PK1, PK2
non-clustered index on PK2
按顺序选择PK,因为它是载荷的顺序
在加载期间,非聚集索引被禁用,然后在加载结束时重建 那个索引杀死了加载速度,并且在负载结束时碎片化,无论如何都需要重建
最后回答问题。
我认为答案是肯定的,但这似乎是好事。
Guidelines for Using Indexes on Memory-Optimized Tables
进一步检查有一些限制:
Transact-SQL Support for In-Memory OLTP
没有打开批评产品的问题,这是一个很酷的功能。但是,如果表不支持声明性参照完整性(DRI),您可以将其称为关系数据库吗?
答案 0 :(得分:1)
从你的问题。
It is my understanding that memory-optimized indexes do not fragment.
As an in-memory table would I reverse the PK (PK2, PK1) and have a second index on PK1?
Is there no reason to drop and recreate the index on PK1?
Does index fragmentation truly go away in a memory-optimized table?
问题1,是内存优化的索引不会碎片化。
问题2,没有。你想要的是PK2上的哈希索引和PK1上的哈希索引。如果你想在PK1上保留密钥唯一性,那么你需要在PK1和PK2上使用非群集密钥。小心PK2没有多少重复。
问题3,删除和重新创建索引不能在内存优化表中完成。
问题4,是的,碎片化会消耗内存优化表。
谢谢盖伊
答案 1 :(得分:0)
由于大多数搜索都在PK2上,因此我将按照目标表中要查询的所需顺序从源表中卸载数据。例如:
UNLOAD TO "loadfile" SELECT * FROM sourcetable ORDER BY pk2, pk1;
DROP INDEXES ON targettable;
LOAD FROM "loadfile" INSERT INTO targettable;
CREATE NONCLUSTERED INDEX idxpk2 ON targettable(pk2);
CREATE NONCLUSTERED INDEX idxpk1 ON targettable(pk1);
以目标表中最常查询的排序顺序卸载数据与pk2上的CLUSTERING基本相同,除非您不必对目标表中的数据进行物理重新排序。通过在将新数据加载到目标tablew上之前删除索引来提高加载速度,并重新创建索引将优化访问。
查看我的相关question and answers.