理论上,当数据库服务器接收到一个简单的 SQL 语句(或批处理)时,它必须对其进行编译:将其解析为某种内部形式,然后准备所谓的“查询计划”——操作序列(如索引或表)扫描、比较等)以执行实际请求。做这一切显然会耗费一定的服务器资源。如此多的 DBMS 开始支持“准备好的语句”:服务器只执行一次解析/规划步骤,然后将“句柄”交给您随后多次“调用”的结果,只提供不同的参数。
现在让我们进入一个更复杂的领域。
首先要注意的是,当内存和处理能力变得更便宜时,在商品到高端服务器上运行的 DBMS 能够在处理查询时花费更多资源,因此其中一些缓存用户查询。也就是说,当您执行简单查询(SQL 语句或批处理)时,服务器会执行所有常见的解析/查询计划,但随后会保存结果,如果稍后遇到相同的查询,它会跳过处理部分并执行对数据的操作。
第二点要注意的是,虽然编程语言/库倾向于为程序员提供访问数据库引擎的某个通用C
接口(ODBC是一个例子,database/sql
forGo
是另一个例子,还有无数其他的),但有线协议或其他实际访问服务器的方式可能大不相同。例如,一台数据库服务器可能支持在其有线协议中与查询一起传递参数,而另一台可能不支持,因此访问层必须将您的参数转换为转义的 SQL 文字并将它们嵌入到查询中,然后将其发送到服务器.
您应该从中获得的主要思想是:数据库引擎是不同的,如果您计划通过程序对其施加大量负载,则必须了解自己的来龙去脉。了解您的 DMBS 的有线协议可以做什么和不能做什么,知道您的 DBMS 是否快速建立连接等等等等。查找有关特定 DBMS 性能优化的文档。
有关不同 DBMS 的一些讨论,另请参见this和this。