sql - 与 DBMS 的内存通信

标签 sql c memory database

是否可以选择将 DBMS 中的 TVF/UDF 与外部 IDE 或 C 等语言进行通信?在不写入表的情况下执行此操作?

我知道有一种“内存映射”方法或共享内存块的方法

POSIX mmap() 函数 Windows OpenFileMapping() 函数

我使用的是 Windows,那么有没有办法使用内存映射或与 C 之类的东西共享来与 DBMS 进行通信? 但是如何避免只使用内存写入表或文件呢?

最佳答案

共享内存可用作 SQL 提供程序之间的数据传输。如果您使用内置驱动程序来访问提供程序,则无需为此编写任何其他代码。相反,您只需配置驱动程序和服务器即可使用它,并且您的应用程序必须与 SQL 提供程序驻留在同一服务器上。

适用于 Windows 的 ODBC 驱动程序支持 SQL 事件的共享内存。要使用 C 语言编写这些代码,您将使用 ODBC API 与您的提供商进行通信。这是包含函数引用的链接。

ODBC Function Summary @ MSDN

另请注意,所有可以处理任意二进制数据的 SQL 提供程序都支持 BLOB。此处提供了 ODBC API 已知类型的列表。没有严格要求您的报表结果必须以表格形式表达。

SQL Data Types @ MSDN

另一方面,如果担心按照您自己的方式与内部 SQL 实体进行通信,您也许可以通过对您正在使用的 SQL 服务的扩展来将某些内容修补在一起。例如,MS SQL Server 允许通过 Ole 自动化过程或 CLR (.net) 集成(在 MS SQL Server 中可用)进行扩展。您可能会使用这些来进行带外通信。然而,使用纯 C 解决方案都不容易创建这些。

Ole Automation Procedures in SQL Server @ MSDN

CLR Integration in SQL Server @ MSDN

但是,我建议您避免这样做,因为您会发现您受到主机服务环境的摆布,并且您可能无法参与交易。

如果您的数据集大小要求太大,以至于您认为 RAM 和直接访问是您的最佳选择,那么通过仅通信 SQL 外部保存的数据集中发生更改的部分可能会更好地满足您的需求。此外,由于共享内存解决方案仅限于一台计算机,因此您可能需要考虑将数据集上的工作拆分到多台计算机上。通过这种方式,您更有可能看到性能/生产力的提高,而不是通过改变在 SQL 中引用数据的方式。

最后,很难要求 SQL 提供者避免使用文件系统存储。对于 MS SQL Server,一种可能的选择是强制 tempdb 驻留在 RAM 中。这是一篇包含更多详细信息的知识库文章。其他 DBMS 可能有类似的配置选项。

INF: When to use tempdb in RAM

但是,磁盘存储的使用并不一定令人担忧。我无法找到一个很好的例子来说明 SQL 提供程序如何管理 RAM/文件系统平衡,但 SQL Server 的一个很好的类比是 Windows 如何受到页面文件使用的影响。这是一个很好的链接,详细介绍了 Windows 在高操作限制下的行为方式,以及内存使用不一定对应于磁盘使用溢出。另请注意,当主机的操作接近这些限制时,编写在 Windows 上运行的应用程序也会受到不利影响。

Pushing the Limits of Windows: Virtual Memory @ TechNet

关于sql - 与 DBMS 的内存通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5574300/

相关文章:

sql - Left Outer join 与同一个表作为外部连接的一部分

sql - 临时表还是永久表?

c++ - 为什么这个 C++ 代码可以编译?它有什么作用?

c - Scanf 需要比 C 中更多的值

c - C 中的链表

java - 由于意外的内存不足错误,应用程序失败。

mysql - 缓慢的mysql子查询

sql - 在 SQL Server 中存储大型数据集的最佳方式?

c++ - 在 std::erase() 产生未定义行为之前调用 std::fill() 吗?

memory - GPU PoolAllocator 爆 CPU 内存