SQL Server 2014的内存中OLTP(Hekaton)与Redis的概念是相同还是相似?
我使用Redis进行内存存储(存储在RAM中)和缓存,同时使用单独的SQL Server数据库(如StackExchange).Hekaton可以做同样的事情吗?
我正在尝试删除在表上创建的索引,但出现此错误 -
只有内存优化表才支持“ALTER TABLE DROP INDEX”操作。
我需要删除此索引才能删除表中的字段。有没有办法在不复制表和迁移所有数据的情况下做到这一点?
我正在使用SQL Server 2014 CTP2,READ_COMMITTED_SNAPSHOT ON(我认为这对问题很重要).
我创建了一个In-Memory表类型(非常类似于technet博客,SQL Server 2014 In Memory OLTP:内存优化表类型和表变量),我有几个内存表.
在查询本身中,我在常规内存表和内存表类型之间有一个连接,充当过滤器,当我执行查询时,我收到此错误消息:"使用READ访问内存优化表的查询当数据库选项READ_COMMITTED_SNAPSHOT设置为ON时,COMMITTED隔离级别无法访问基于磁盘的表.使用表提示(例如WITH(SNAPSHOT))为内存优化表提供支持的隔离级别.
我正在写这个问题时删除了READ_COMMITTED_SNAPSHOT,但问题仍然存在,如果我创建了一个内存数据类型,并且这个特定类型将"永远不会溢出到磁盘",正如博客所说,为什么呢?服务器"看到"它作为"磁盘表?
为了清理,我尝试只使用In-Mem表进行连接并且它可以工作,只要表类型进来我就得到了错误.
更新:当我删除READ_COMMITTED_SNAPSHOT(现在已关闭)时,查询有效,但现在我已经丢失了多版本/无锁定/速度,我想听听另一个解决方案.
谢谢
CREATE DATABASE MemOptimized
GO
ALTER DATABASE MemOptimized
ADD FILEGROUP mofg
CONTAINS MEMORY_OPTIMIZED_DATA
GO
ALTER DATABASE MemOptimized
ADD FILE ( NAME = N'mofg',
FileName = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\MemOptimized.ndf')
TO FILEGROUP mofg
Run Code Online (Sandbox Code Playgroud)
CREATE TYPE [dbo].[tType] AS TABLE(
[C] [int] NOT NULL
INDEX ix NONCLUSTERED HASH (C) WITH (BUCKET_COUNT = 8)
) WITH ( MEMORY_OPTIMIZED = ON )
CREATE TABLE …Run Code Online (Sandbox Code Playgroud) sql-server in-memory user-defined-types sql-server-2014 memory-optimized-tables
描述:
RocksDB 是一个键值存储,因此我们可以简单地序列化对象列表并存储与键对应的值。如果列表中的数据足够小,这将是可以的。
但是如果列表很大并且大小不断增加,那么我们需要对数据进行分页。因此,在这种情况下,存储与单个键对应的整个序列化列表数据不是一个好主意;因为会存在性能问题,因为每次将新数据插入列表时,这个非常大的值也需要在读取期间读取和更新,当向用户显示列表时,将检索整个值,而只有一部分是用户需要。
例如:假设我们想将用户下的订单存储在 RocksDB 中。然后我们可以在 RockDB “u:1:li:o” 中以下列方式存储这个订单数据:Serialised([O1{}, O2{},....On{}])。但是如果用户下的订单数以千计,我们想以页面的形式检索订单(一次 10 或 20 条记录)。因此,在同一个键中存储数千个订单并从该键中检索整个数据然后提供所需的 10-20 条记录并不是一个好主意。此外,用户向同一键添加新订单将影响上述性能。
所以我正在努力设计模式以在 RocksDB 中有效地存储和检索如此大的列表。
如果您能就架构设计提出您的建议,那将会很棒且非常有帮助。
database-design in-memory-database memory-optimized-tables rocksdb
我已经观察到,将数据插入内存优化表比在5-SSD条带集上对基于磁盘的表进行等效的并行插入要慢得多。
--DDL for Memory-Optimized Table
CREATE TABLE [MYSCHEMA].[WIDE_MEMORY_TABLE]
(
[TX_ID] BIGINT NOT NULL
, [COLUMN_01] [NVARCHAR](10) NOT NULL
, [COLUMN_02] [NVARCHAR] (10) NOT NULL
--etc., about 100 columns
--at least one index is required for Memory-Optimized Tables
, INDEX IX_WIDE_MEMORY_TABLE_ENTITY_ID HASH (TX_ID) WITH (BUCKET_COUNT=10000000)
)
WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY)
--DDL for Disk-Based Table
CREATE TABLE [MYSCHEMA].[WIDE_DISK_TABLE]
(
[TX_ID] BIGINT NOT NULL
, [COLUMN_01] [NVARCHAR](10) NOT NULL
, [COLUMN_02] [NVARCHAR] (10) NOT NULL
--etc., about 100 columns
--No indexes
) ON [PRIMARY] …Run Code Online (Sandbox Code Playgroud) sql-server performance query-performance memory-optimized-tables
我正在尝试使用经典临时表对 Microsoft SQL Server 2016 中的内存优化表进行基准测试。
SQL Server 版本:
Microsoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64) Mar 18 2018 09:11:49
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows 10 Enterprise 10.0 <X64> (Build 17134: ) (Hypervisor)
Run Code Online (Sandbox Code Playgroud)
我正在遵循此处描述的步骤:https : //docs.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/faster-temp-table-and-table-variable-by-using-内存优化?view=sql-server-ver15。
CrudTest_TempTable 1000, 100, 100
go 1000
Run Code Online (Sandbox Code Playgroud)
相对
CrudTest_memopt_hash 1000, 100, 100
go 1000
Run Code Online (Sandbox Code Playgroud)
这个测试有什么作用?
并且这样重复了 1000 次。
第一个使用经典临时表的存储过程大约需要 6 秒才能运行。
第二个存储过程至少需要 15 秒,并且通常会出错:
开始执行循环
消息 3998,级别 16,状态 1,第 3
行在批处理结束时检测到不可提交的事务。事务回滚。 …
我想将SQL Server 2016中内存优化表的DURABILITY从SCHEMA_AND_DATA更改为SCHEMA_ONLY。
在微软的文档表明,以下ALTER TABLE语句应该工作:
ALTER TABLE mem_opt_table
DURABILITY = SCHEMA_ONLY
Run Code Online (Sandbox Code Playgroud)
但是它给出了以下错误:
Msg 102, Level 15, State 1, Line 12
Incorrect syntax near 'DURABILITY'.
Run Code Online (Sandbox Code Playgroud)
更改桌子上的耐用性设置的正确语法是什么?我还缺少其他步骤吗?
我正在将磁盘中的队列迁移到内存中的SQL Server 2016中以实现队列。
这是我的队列格式:
CREATE TABLE dbo.SimpleQueue
(
MsgId BIGINT NOT NULL PRIMARY KEY NONCLUSTERED IDENTITY(1, 1),
Payload VARCHAR(7500) NOT NULL,
IsDeleted BIT NOT NULL
) WITH (MEMORY_OPTIMIZED=ON)
GO
Run Code Online (Sandbox Code Playgroud)
这是我的Enqueue本机SQL Server存储过程:
CREATE PROCEDURE dbo.Enqueue(@Payload VARCHAR(7500), @IsDeleted BIT)
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS BEGIN ATOMIC WITH
(TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = 'english')
INSERT INTO dbo.SimpleQueue (Payload, IsDeleted) VALUES (@Payload, @IsDeleted);
END
GO
Run Code Online (Sandbox Code Playgroud)
我正在尝试写下本Dequeue机SQL Server存储过程,但是在如何实现UPDATESELECT或变量表的使用结果方面遇到一些困难。
到目前为止,我尝试了:
CREATE PROCEDURE dbo.Dequeue(@BatchSize INT = 1) …Run Code Online (Sandbox Code Playgroud) sql-server queue stored-procedures in-memory-database memory-optimized-tables
试图了解事务隔离级别如何在 SQL Server 内存优化表(内存中 oltp)上工作。
如果我执行以下查询:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRANSACTION
SELECT *
FROM tm.Tasks
Run Code Online (Sandbox Code Playgroud)
显示错误消息:
只有自动提交事务才支持使用 READ COMMITTED 隔离级别访问内存优化表。它不支持显式或隐式事务。使用表提示为内存优化表提供受支持的隔离级别,例如 WITH (SNAPSHOT)。
现在,如果我通过添加表提示来修改查询,它会起作用:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
SELECT *
FROM tm.Tasks WITH(SNAPSHOT)
Run Code Online (Sandbox Code Playgroud)
但是,如果我通过更改事务隔离级别SET TRANSACTION ISOLATION LEVEL SNAPSHOT并删除表提示:
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRANSACTION
SELECT *
FROM tm.Tasks
Run Code Online (Sandbox Code Playgroud)
它不再工作,显示错误消息:
当会话 TRANSACTION ISOLATION LEVEL 设置为 SNAPSHOT 时,无法访问或创建内存优化表和本机编译模块。
为什么它与表提示一起工作,并通过设置事务隔离级别
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
Run Code Online (Sandbox Code Playgroud)
才不是?
更新:尝试设置MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT为ON,仍然从上次查询中得到相同的错误:
当会话 …
sql-server snapshot-isolation memory-optimized-tables sql-server-2016 in-memory-oltp