是否可以选择使用外部IDE或C语言在DBMS中通信TVF/UDF
?没有写到桌子上就这样做了吗?
我知道有一种“内存映射”方式或共享内存块的方法
POSIX mmap()
功能
Windows OpenFileMapping()
功能
我正在使用Windows,那么有没有办法使用内存映射或与C等共享来共享DBMS? 但是如何使用内存来避免写入表或文件?
答案 0 :(得分:1)
共享内存可用作与SQL提供程序之间的数据传输。如果您使用内置驱动程序访问提供程序,则无需为此编写任何其他代码。相反,您只需将驱动程序和服务器配置为使用它,您的应用程序必须与SQL提供程序驻留在同一服务器上。
可用于Windows的ODBC驱动程序支持SQL活动的共享内存。要从C编写这些代码,您可以使用ODBC API与您的提供程序进行通信。这是一个带有函数引用的链接。
另请注意,所有可以处理任意二进制数据的SQL提供程序都支持BLOB。此处提供了ODBC API已知类型的列表。没有严格要求您的陈述结果必须以表格形式表达。
另一方面,如果您担心按照自己的条件与内部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上运行的应用程序也会受到不利影响。
答案 1 :(得分:0)
DBMS必须按照您的意愿设计。常规DBMS有自己的数据管理机制,虽然您可以通过共享内存与它们进行通信,但您更有可能不会。 DBMS可能将大部分工作数据保存在内存中;这取决于DBMS。通常,数据将由磁盘存储支持。
你不能做的是采取一个任意的DBMS并判断它应该通过共享内存与你的进程通信。如果它是这样设计的,那么你可以;否则,你不能。
但是,通常情况下,使用ODBC或类似驱动程序从应用程序访问DBMS,实现驱动程序(和DBMS)的那些驱动程序决定了进程间通信的发生方式。