问题标签 [memory-optimized-tables]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server - 本机编译的模块不支持函数 nchar
错误:本机编译的模块不支持函数 nchar。
如何Nchar()
在本机函数中使用函数?
我的查询是:
sql-server - SQL Server 内存优化表检测并发冲突
在 SQL Server 内存优化表中,rowversion
不允许使用该数据类型。
在我的应用程序中,我仍然希望能够检测到并发冲突,其中用户 A 打开一个项目进行编辑,用户 B 打开同一个项目,用户 A 保存并且用户 B 保存而没有看到用户 A 的更改。多年来,我一直rowversion
为此使用一个专栏。管理我自己的假rowversion
专栏有什么建议?
c# - 更新内存优化表
我在 SQL Server 2017 中有一个名为“用户”的内存优化表。
我要将一行更新为:
在 SaveChanges() 语句中,出现此异常:
仅自动提交事务支持使用 READ COMMITTED 隔离级别访问内存优化表。显式或隐式事务不支持它。使用诸如 WITH (SNAPSHOT) 之类的表提示为内存优化表提供支持的隔离级别。
我尝试更改数据库上的一些选项,例如:
在我的代码中也使用带有快照隔离的事务,但没有实现。
sql-server - 使用内存优化表时,数据库大小是否应不超过 RAM 大小?
在 SQL Server 2016 中,如果我们在 RAM 中创建数据库(即使用内存优化表),数据库大小不应超过 RAM 大小,我说的对吗?
sql-server - 内存优化表 - 插入速度比 SSD 慢
我观察到将数据插入到内存优化表中比在 5-SSD 条带集上的基于磁盘的表中的等效并行插入要慢得多。
对于这个特定的测试,我将 10,000,000 行以 25,000 为一组批处理到该表中。对于内存优化表,该语句看起来像这样:
此过程继续加载 10,000,000 行。每次迭代只检索接下来的 25,000 行。SELECT 在 [MY_SCHEMA].[SOURCE_TABLE] 上的覆盖索引上执行查找。查询计划显示了对 BIG_MEMORY_TABLE的序列化插入。每组 25,000 行大约需要 1400 毫秒。
如果我对托管在 5-SSD 条带上的基于磁盘的表执行此操作(每个磁盘 5,000 IOPS,吞吐量为 200MB/秒),插入进度会快得多,平均约为 700 毫秒。在基于磁盘的情况下,查询对 [MY_SCHEMA].[WIDE_DISK_TABLE]执行并行插入。请注意 [MYSCHEMA].[WIDE_DISK_TABLE] 上的 TABLOCK 提示。
当然,基于磁盘的表没有索引,并且 TABLOCK 提示启用并行插入,但我希望从 INSERT 到 RAM 的方式更多。
有任何想法吗?
谢谢!
以下是在 3 种模式下运行的 100 个批次的比较:基于磁盘,使用延迟索引创建,基于磁盘使用索引,以及使用索引优化内存(内存优化表至少需要一个索引)。
sql-server - 内存优化数据库和表变量
在查看了不同的小组/讨论后,我没有找到任何令人满意的问题答案,
我在生产中有大约 1.5 TB 大小的 Sql server 数据库,并且在这个数据库上还设置了一个事务复制,为了添加/迁移基于内存优化表的磁盘,我们只需要创建一个具有内存优化数据的文件组或任何整个数据库的其他设置?
如果我们只使用不持久的内存优化表变量,我们是否需要在整个数据库上应用相同的设置?
并且在非本机编译存储过程中的内存表变量中使用是否会有任何性能提升?
最重要的是,对复制有什么影响?我们不能在复制中添加持久内存优化表吗?但是如果只在主数据库上进行文件组或数据库上的任何其他设置呢?
谢谢
sql - 对于内存优化的 SQL Server 存储过程,例如 MERGE 的最佳迭代方法是什么?
我必须在我的 SQL Server 数据库中处理具有数百万行的集合。
几乎我所有的命令都使用该MERGE
语句。我在这里和那里合并,这张桌子和那张桌子。我为此使用存储过程,因为我相信这将提供最佳性能。
我发现这个过程对我来说太慢了(合并 2kk 行 - 似乎从 5 到 50 秒随机),也就是说,性能并不是最好的,由于某种原因我找不到原因:我打开了任务管理器和资源监视器,启动了一些繁重的MERGE
查询,确保实际执行计划中不存在扫描或其他不愉快的项目。而且我看到 CPU、内存和磁盘驱动器的消耗非常低。我仍然不知道其原因。
最近我还发现内存优化表与本机存储过程相结合应该提供更好的性能。
事实证明,Merge
它不适用于 MO 表,并且 MO 表不适用于本机存储过程。
在 MSDN 上替换 Merge的唯一示例使用奇怪的方法,基于 while 循环和额外的列 RowId 来“按索引访问行”。好吧,我学到了更多信息,我重复了 MSDN 示例,在该列上建立了一些带有大量存储桶 (8kk) 的哈希索引,并且确实有一些性能提升。
但同样,循环中的每次迭代都需要至少两次索引查找,以及满足条件时的插入/更新/删除。
所以我问:有没有什么有用的策略来放置一个真正的高性能merge
?有没有办法,我不知道,可能是写一个 CLR 程序?那会更好吗?还有其他提示或提示吗?
sql-server - 通过使用内存优化更快的 SQL 临时表和表变量
此 Microsoft Doc中的方案 C描述了如何将范围限定为连接的临时表替换为内存优化表。该方案使用过滤器安全策略,该策略调用一个函数来确定@@spid 是否与内存优化表中的 SpidFilter 列匹配。
这适用于 .NET 连接池吗?我希望@@spid 将返回与一遍又一遍地重用连接相同的数字。.NET 通过调用 sp_reset_connection 清除会话范围的临时表,但这不会清除内存优化表或更改 @@spid。也许可以添加 sys.dm_exec_sessions 的 session_id 以使其在连接池环境中工作?
sql-server - 本机编译存储过程 sp_getapplock 替代方案
tldr; 本机编译的存储过程中 sp_getapplock 的替代方法是什么。
我有一个内存优化表,上面的索引很少。它是关键任务应用程序。我使用的是内存优化表,因为它的日志记录最少。我正在开发订单匹配/交易匹配引擎。一次插入一个订单并与未结订单匹配。这不是批量操作。我尝试过使用常规表,但无法达到我需要的吞吐量。内存优化表解决了吞吐量问题。
我想限制 SQL 服务器不运行多个存储过程的实例。在常规存储过程中,这可以通过 sp_getapplock 来实现。如何使用本机编译的存储过程来实现这一点?
我用谷歌搜索并没有找到答案。