编写异步/事件驱动的SQL Server是否可能或可取?

时间:2014-07-12 06:48:34

标签: sql database multithreading asynchronous nosql

免责声明:这更像是一个理论问题,而不是DBMS问题 - 这就是我将其置于SO上的原因。我可能完全错了,这可能是一个坏主意。

许多研究表明,任务(线程和进程都有)具有不合需要的空间和时间开销,尤其是在I / O绑定的应用程序中。根据要求,许多查询实际上可以成为I / O绑定 - 尤其是。当它是扫描时,而不是索引命中。我意识到,由于看似冲突的并行查询的愿望,这很复杂。但我不相信它实际上是冲突的。您只需要一个池 - 大约NUM_CPU。

这可能与SQL一样复杂吗?是否可以使用比SQL更复杂的东西?可以想象给定作业的线程池(~NUM_CPU) - 指示目的的对象&状态 - 在大海捞针块中找到一根针。池中的每个线程都将获得一系列作业以查找内容。当任何线程在I / O上等待时,它可以继续前进并在给定的不同作业中寻找不同的针。当所有工作完成后,排队的工作就会完成。

...或者这是线程的工作 - 我们只是在userland中重新发明内核线程吗?也许这是真的 - 作为状态对象的复杂性 - >无限,你只是重新发明线程。没有事件就可以更容易地思考它,而且我很确定我不知道如何编写基于事件的数据库引擎,更不用说基于线程的数据库引擎了。这听起来很难,但有可能甚至是可取的吗?

1 个答案:

答案 0 :(得分:0)

您的问题似乎是:为什么在RDBMS的上下文中使用异步IO进行磁盘访问?

Async IO用于在IO操作运行时不阻塞线程。这允许您拥有更少的线程。这节省了堆栈内存和少量OS资源。它还可以提高OS调度效率。

也就是说,无论是使用异步IO还是线程从磁盘读取都与磁盘吞吐量无关。无论哪种方式,您都将最大化IO子系统。通过改变调用内核的方式,磁盘不会神奇地变得更快。 Async IO只会改变调用的方式,而不会改变调用的方式。

Async IO通常用于高度并发,例如在具有100或甚至数百万套接字的套接字应用程序中(您只能拥有1M线程)。对于磁盘IO,它不能提高吞吐量,因为要应用于磁盘的并行度很小。