Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 对内存中表的查询比对基于磁盘的表的查询慢_Sql Server_Performance_Memory Optimized Tables - Fatal编程技术网

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
尽管如此,像使用/out
groupby
的简单选择这样的查询要比针对原始表执行的查询慢。我也尝试过使用非聚集索引和增加桶数,但仍然是一样的

如何加快查询速度?

您应该添加

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重新编译,记住现在有数据


它应该快得多。

我建议你在网上问这个问题