有时,我的数据库进程的使用者会要求估计给定任务的完成时间。虽然我觉得我知道如何在大多数数据库引擎中阅读 EXPLAIN,但我在尝试将其翻译为“15 分钟后再问我”时遇到了麻烦。有谁知道用于任何特定数据库的良好“经验法则”?
我意识到这不会是一个硬性规定,但在某些情况下,即使能够给出一个大致数字也可能会有用。
有时,我的数据库进程的使用者会要求估计给定任务的完成时间。虽然我觉得我知道如何在大多数数据库引擎中阅读 EXPLAIN,但我在尝试将其翻译为“15 分钟后再问我”时遇到了麻烦。有谁知道用于任何特定数据库的良好“经验法则”?
我意识到这不会是一个硬性规定,但在某些情况下,即使能够给出一个大致数字也可能会有用。
我怀疑这不可能像你想象的那样。一个重要原因是实际运行时间非常依赖于硬件,数据库引擎所做的许多优化决策实际上是关于平衡不同硬件组件(例如,磁盘、内存、CPU)的使用。
我建议您运行一系列与您的应用程序相关的查询,记录成本估算和运行时间,并尝试理解这些数据。您可能会得到很好的线性关系,或者您可能会了解到成本数字对于此目的毫无价值。
基于成本的优化器都通过各种专有算法工作(或者您可以阅读它们以了解开源数据库),但它们通常通过为参考操作分配值 1 来工作。例如,在 SQL Server 中,成本估算为的操作在雷德蒙德某个开发人员办公桌下的参考计算机上,1 需要 1/320 秒。成本计算只是对查询成本的相对猜测。许多 RDBMS 使用此成本来建立优先级,或者在出现死锁的情况下终止成本较低的查询(它们再次运行所需的时间更少)。但这只是基于查询优化器在查询运行时所掌握的信息的猜测。
Peter 是正确的,您所能期望的最好结果是在理想场景中运行一些基准查询,并使用这些查询作为最佳猜测的基础。您必须处理 RDBMS 中许多不同的争用点,因此很难具体确定任何给定查询在现实世界中的执行情况。