我正在使用一个已经构建的表,我必须迁移到一个内存优化的表。以下是基于磁盘的克隆。两者具有相同的结构,只是基于磁盘的表没有主键,即使该OID
字段不应重复。
CREATE TABLE [dbo].[DATA_IM](
[OID] [varchar](36) NOT NULL, -- NEWID()
[YEAR] [varchar](15) NOT NULL INDEX hash_sce HASH (YEAR) WITH (BUCKET_COUNT = 128),
[MONTH] [varchar](2) NOT NULL,
[DEPARTMENT][varchar](30) NOT NULL INDEX hash_dep HASH (DEPARTMENT) WITH (BUCKET_COUNT = 64),
[ACCOUNT] [varchar](30) NOT NULL INDEX hash_acct HASH (ACCOUNT) WITH (BUCKET_COUNT = 2048),
[DIM1] [varchar](30) NULL INDEX hash_de1 HASH (DIM1) WITH (BUCKET_COUNT = 256),
[DIM2] [varchar](30) NULL INDEX hash_de2 HASH (DIM2) WITH (BUCKET_COUNT = 256),
[DIM3] [varchar](30) NULL INDEX hash_de3 HASH (DIM3) WITH (BUCKET_COUNT = 256),
[DIM4] [varchar](30) NULL INDEX hash_de4 HASH (DIM4) WITH (BUCKET_COUNT = 256),
[DIM5] [varchar](30) NULL,
[CATEGORY] [varchar](30) NOT NULL INDEX hash_cat HASH (CATEGORY) WITH (BUCKET_COUNT = 256),
[VALUE] [numeric](27, 9) NOT NULL,
[CURRENCY] [varchar](5) NULL,
[ORIGIN] [varchar](80) NULL,
[USERUPD] [varchar](255) NULL,
[DATEUPD] [datetime] NULL,
[NOTE] [varchar](1000) NULL
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
由于每个内存优化表都必须至少有一个索引,并且列是其他表的外键,因此我已经使这些列的哈希索引计算BUCKET_COUNT
了 web 上指示的值:
with cte1 AS (select count(distinct year) year from data),
cte2 AS (select count(distinct department) dept from data)
SELECT POWER(2, CEILING(LOG(year) / LOG(2))) AS [year],
POWER(2, CEILING(LOG(dept) / LOG(2))) AS [dept]
FROM cte1, cte2
然而,诸如带/出group by
的简单选择之类的查询比针对原始表执行的查询要慢。我也尝试过使用非聚集索引并增加存储桶数,但还是一样。
我怎样才能加快查询速度?