在内存优化表上使用索引

时间:2013-07-12 14:02:43

标签: tsql indexing sql-server-2014

尝试制定SQL Server 2014内存优化表的方法

一个非常简单的表是应用程序中最活跃的表

  • 数据永远不会发生变异
  • 负载都是通过批量处理
  • 约2亿条记录
  • 目前所有读取均为(nolock)

int PK1  
int PK2  
composite clustered PK of PK1, PK2  
non-clustered index on PK2    

按顺序选择PK,因为它是载荷的顺序

在加载期间,非聚集索引被禁用,然后在加载结束时重建 那个索引杀死了加载速度,并且在负载结束时碎片化,无论如何都需要重建

  • 所有搜索都是相等的(从不<,>,<>)
  • 大部分搜索都在PK2上
  • 对PK1进行一些简单的搜索,并在连接中使用。

最后回答问题。

  • 据我所知,内存优化索引不会碎片化。
  • 作为内存表,我会反转PK(PK2,PK1)并在PK1上有第二个索引吗?
  • 没有理由在PK1上删除并重新创建索引吗?
  • 在内存优化表中,索引碎片真的会消失吗?

我认为答案是肯定的,但这似乎是好事。

Guidelines for Using Indexes on Memory-Optimized Tables

进一步检查有一些限制:

  • ALTER TABLE,sp_rename,alter bucket_count,以及添加和删除 不支持CREATE TABLE语句之外的索引 内存优化表。
  • 不支持UNIQUE,CHECK和FOREIGN KEY约束。

Transact-SQL Support for In-Memory OLTP
没有打开批评产品的问题,这是一个很酷的功能。但是,如果表不支持声明性参照完整性(DRI),您可以将其称为关系数据库吗?

2 个答案:

答案 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.