【问题标题】:Memory Optimized Table With Some Terrible Response Time内存优化表具有一些可怕的响应时间
【发布时间】:2014-07-01 17:19:56
【问题描述】:

用内存优化表替换大表
对于某些东西,我对它死掉的某些东西有很好的响应时间
它是一个复合主键
我可以让它使用主键的唯一方法是搜索特定行(整个 PK)
不会使用 PK 进行排序或仅使用复合键的一个组件
根据现有数据调整哈希桶的大小

使用此链接中的语法作为复合主键
Hekaton: Composite Primary Key in create table statement
CREATE TABLE (SQL Server)

CREATE TABLE [dbo].[FTSindex]
(
    [sID] [int] NOT NULL,
    [wordPos] [int] NOT NULL,
    [wordID] [int] NOT NULL,
    [charPos] [int] NOT NULL,

INDEX [ix_wordID_MO_2] NONCLUSTERED HASH 
(
    [wordID]
)WITH ( BUCKET_COUNT = 524288),
CONSTRAINT [pk_FTSindexMO_2] PRIMARY KEY NONCLUSTERED HASH 
(
    [sID],
    [wordPos]
)WITH ( BUCKET_COUNT = 268435456)
)WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_ONLY )

select top 10 * from [FTSindex] where [sID] = 100
-- runs in 0 seconds 
-- Index Seek on ix_wordID_MO_2 
-- it is NOT using the PRIMARY KEY pk_FTSindexMO_2

select top 10 * from [FTSindex] where [wordPos] = 100
-- never finishes (I only waited 10 minutes) 
-- will not even display an execution plan

select top 10 * from [FTSindex] where [sID] = 100 and [wordPos] < 1000
-- never finishes (I only waited 10 minutes) 
-- will not even display an execution plan


select top 10 * from [FTSindex] order by [sID]
-- never finishes (I only waited 10 minutes) 
-- query plan is Table Scan 

select top 10 * from [FTSindex] order by [sID], [wordPos]
-- never finishes (I only waited 10 minutes) 
-- will not even display an execution plan

select top 10 * from [FTSindex] where [wordID] = 100 and [sID] = 856515 
-- runs in 0 seconds
-- Index Seek on ix_wordID_MO_2

select top 10 * from [FTSindex] where [wordID] = 100 and [sID] = 856515  and [wordPos] < 1000
-- never finishes (I only waited 10 minutes) 
-- will not even display an execution plan

select * from [FTSindex] where [sID] = 100  
-- 45 seconds to return 1500 rows 
-- table scan 

select * from [FTSindex] where [sID] = 100  and [wordPos] = 1133 
-- runs in 0 seconds
-- this uses the pk_FTSindexMO_2 
-- this is the only way I could get it to use the primary key 

注意原文(非内存优化表)
所有这些查询都在 0 秒内运行
我不是说每个
全部在 0 秒内运行

我想这总结了我的问题
Troubleshooting Common Performance Problems with Memory-Optimized Hash Indexes

不使用 HASH 作为主键似乎已经解决了它

CREATE TABLE [dbo].[FTSindex]
(
    [sID] [int] NOT NULL,
    [wordPos] [int] NOT NULL,
    [wordID] [int] NOT NULL,
    [charPos] [int] NOT NULL,

INDEX [ix_wordID_MO_2] NONCLUSTERED HASH 
(
    [wordID]
)WITH ( BUCKET_COUNT = 524288),
CONSTRAINT [pk_FTSindexMO_2] PRIMARY KEY NONCLUSTERED 
(
    [sID] ASC,
    [wordPos] ASC
)
)WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_ONLY )

最后请注意,我会回到旧的基于磁盘的表
在应用程序使用内存优化的实际查询中较慢
优化的内存确实加载得更快,但是这个表是一次写入,多次读取

【问题讨论】:

  • 你没有提到你有多少条记录。
  • @HamletHakobyan 这有什么关系?前 10 名甚至没有运行,甚至不会显示查询计划。就像 2 亿行一样。我说我根据现有数据调整了存储桶的大小。
  • 尝试使用OPTION (FAST 10)提示并告诉我结果。
  • @HamletHakobyan 在 OPTION (FAST 10) 上没有区别。但我更新了这个问题。如果我搜索整个 PK,那么它将使用 PK。

标签: tsql query-optimization sql-server-2014 memory-optimized-tables


【解决方案1】:

哈希索引不适用于范围扫描。范围索引是。

【讨论】:

  • 我不知道这是什么意思
  • 哈希索引允许您获取所有具有给定搜索键的行。不适用于索引的排序或扫描范围。请参阅文档。
  • 但是没有什么叫做范围索引。我认为您的意思是非聚集索引(没有哈希)。
  • 是的,看起来你需要去 NONCLUSTERED 或基于磁盘:msdn.microsoft.com/en-us/library/dn133166(v=sql.120).aspx
  • 是的,名称可能在语法上有所不同。在技​​术论文中,他们称之为范围指数。它应该慢得多(如果这与您相关)。
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2021-06-25
  • 2016-07-16
  • 1970-01-01
相关资源
最近更新 更多