与DBMS的内存通信

时间:2011-04-06 23:45:22

标签: sql c memory database

是否可以选择使用外部IDE或C语言在DBMS中通信TVF/UDF?没有写到桌子上就这样做了吗?

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

POSIX mmap()功能 Windows OpenFileMapping()功能

我正在使用Windows,那么有没有办法使用内存映射或与C等共享来共享DBMS?  但是如何使用内存来避免写入表或文件?

2 个答案:

答案 0 :(得分:1)

共享内存可用作与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 Automation Procedures或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服务器的一个很好的模拟是Windows如何受页面文件使用的影响。这是一个很好的链接,详细说明了Windows在高操作极限下的行为,以及内存使用如何不一定对应于溢出到磁盘的使用。另请注意,当主机的操作接近这些限制时,写入在Windows上运行的应用程序也会受到不利影响。

Pushing the Limits of Windows: Virtual Memory @ TechNet

答案 1 :(得分:0)

DBMS必须按照您的意愿设计。常规DBMS有自己的数据管理机制,虽然您可以通过共享内存与它们进行通信,但您更有可能不会。 DBMS可能将大部分工作数据保存在内存中;这取决于DBMS。通常,数据将由磁盘存储支持。

你不能做的是采取一个任意的DBMS并判断它应该通过共享内存与你的进程通信。如果它是这样设计的,那么你可以;否则,你不能。

但是,通常情况下,使用ODBC或类似驱动程序从应用程序访问DBMS,实现驱动程序(和DBMS)的那些驱动程序决定了进程间通信的发生方式。