是否可以选择将 DBMS 中的 TVF/UDF
与外部 IDE 或 C 等语言进行通信?在不写入表的情况下执行此操作?
我知道有一种“内存映射”方法或共享内存块的方法
POSIX mmap()
函数
Windows OpenFileMapping()
函数
我使用的是 Windows,那么有没有办法使用内存映射或与 C 之类的东西共享来与 DBMS 进行通信? 但是如何避免只使用内存写入表或文件呢?
最佳答案
共享内存可用作 SQL 提供程序之间的数据传输。如果您使用内置驱动程序来访问提供程序,则无需为此编写任何其他代码。相反,您只需配置驱动程序和服务器即可使用它,并且您的应用程序必须与 SQL 提供程序驻留在同一服务器上。
适用于 Windows 的 ODBC 驱动程序支持 SQL 事件的共享内存。要使用 C 语言编写这些代码,您将使用 ODBC API 与您的提供商进行通信。这是包含函数引用的链接。
另请注意,所有可以处理任意二进制数据的 SQL 提供程序都支持 BLOB。此处提供了 ODBC API 已知类型的列表。没有严格要求您的报表结果必须以表格形式表达。
另一方面,如果担心按照您自己的方式与内部 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 上运行的应用程序也会受到不利影响。
关于sql - 与 DBMS 的内存通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5574300/