Sql server 对内存中表的查询比对基于磁盘的表的查询慢
我正在使用一个已经构建的表,我必须将其迁移到内存优化的表。以下是基于磁盘的克隆。两者的结构相同,但基于磁盘的表没有主键,即使Sql server 对内存中表的查询比对基于磁盘的表的查询慢,sql-server,performance,memory-optimized-tables,Sql Server,Performance,Memory Optimized Tables,我正在使用一个已经构建的表,我必须将其迁移到内存优化的表。以下是基于磁盘的克隆。两者的结构相同,但基于磁盘的表没有主键,即使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),
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\u计数后对这些列进行了哈希索引,如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
尽管如此,像使用/outgroupby
的简单选择这样的查询要比针对原始表执行的查询慢。我也尝试过使用非聚集索引和增加桶数,但仍然是一样的
如何加快查询速度?您应该添加
OPTION (RECOMPILE)
在你的发言结束时:
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
OPTION (RECOMPILE)
SQL server在创建变量表(无记录)时编译其计划,因此并未对此进行真正的优化。当您用数据填充它时,编译的计划不会得到优化,因为在第一次编译时没有数据
当您添加此选项时,它会告诉SQL Server重新编译,记住现在有数据
它应该快得多。我建议你在网上问这个问题