测量不同 DBMS 查询时间的最佳方法(MySQL、SQlite、Postgres、MariaDB、Oracle)
Best way to measure query time in different DBMS (MySQL, SQlite, Postgres, MariaDB, Oracle)
在大学期间,我正在写一篇关于不同 DBMS 性能的论文。
我在 5 个不同的 DBMS(MySQL、MariaDB、SQLite、Postgres、Oracle)中有一组具有相同数据集的表,我将对它们进行查询。
对于每个 DBMS,我将拥有数据库,它将容纳 1k、10k、100k、1mio、10mio 行。
我想研究每个 DBMS 对相同数据进行相同查询需要多少时间,并比较它们之间的时间。
硬件方面,我会创建一个虚拟机,这样硬件对查询性能的影响就不会那么大了。
这让我想到了时间测量。跨所有 DBMS 测量时间的最准确方法是什么?
每个 DBMS 都有自己的查询测量方式,但是每个 DBMS 的实现方式各不相同,我认为这不是用于比较的代表性数据。
MySQL:
SET profiling = 1;
select COUNT(id) from diplomska.`user`;
SHOW PROFILES;
|3 |1.404277ms |select COUNT(id) from diplomska.`user` u¶LIMIT 0, 200|
PostgreSQL
EXPLAIN ANALYSE select COUNT(id) from diplomska.`users`;
|Execution Time: 58.140 ms
甲骨文
declare
t1 timestamp;
t2 timestamp;
begin
t1 := systimestamp;
select COUNT(id) from diplomska.`users`
t2 := systimestamp;
dbms_output.put_line('Elapsed Seconds: '||TO_CHAR(t2-t1, 'SSSS.FF'));
end;
Elapsed Seconds: +000000 00:00:00.000091000
另一种选择是用某种编程语言(Python、C# 等)编写脚本,然后测量时间并执行查询。但这仍然让我们测量代码编译的时间、DBMS 控制器初始化和获取数据的时间,我们不能只隔离查询时间。
有什么建议吗?
如果您从 dbms 客户端软件进行测量,那么您只能以黑盒方式测量一些东西。
您可以测量这些经过的时间:
- 正在建立连接。
- 准备查询(一些 DBMS 参与准备阶段;其他则全部在客户端完成)。
- 从查询提交到结果集第一行的时间。
- 完成查询的时间 -- 到结果集的最后一行。
当您的测试查询 return 具有许多行的结果集时,最后两者之间的差异很明显。
我不明白如何在不使用某种编程测试工具的情况下准确测量这些数字。您可能会考虑使用 php 及其 PDO 数据库访问包,因为它有 a whole mess of drivers 用于不同的数据库。
而且,我相信你知道:
- 一些数据库可以从它们保留的内部 table 元数据中即时回答
COUNT(id) FROM tbl
之类的问题。这因数据库和版本而异。
- 索引可以将查询性能改变数千倍。
- 在现实世界中,当多个客户端同时使用服务器时,通常会出现数据库性能问题。
在所有列出的 DBMS 中,除了 SQLite 支持下一个代码:
-- create service table which will store data
CREATE TABLE service (id INT, stamp TIMESTAMP(3));
-- store timestamp before test query execution
INSERT INTO service (id, stamp) VALUES (1, CURRENT_TIMESTAMP(3));
-- execute query to test
-- SELECT ... ;
-- store timestamp after test query execution
INSERT INTO service (id, stamp) VALUES (2, CURRENT_TIMESTAMP(3));
-- retrieve elapsed time
SELECT t1.stamp - t2.stamp elapsed
FROM service t1
CROSS JOIN service t2
WHERE t1.id = 2 AND t2.id = 1;
sample fiddle - 您可以使用 MySQL、MariaDB、Oracle、PostgreSQL 进行测试。
在大学期间,我正在写一篇关于不同 DBMS 性能的论文。 我在 5 个不同的 DBMS(MySQL、MariaDB、SQLite、Postgres、Oracle)中有一组具有相同数据集的表,我将对它们进行查询。 对于每个 DBMS,我将拥有数据库,它将容纳 1k、10k、100k、1mio、10mio 行。
我想研究每个 DBMS 对相同数据进行相同查询需要多少时间,并比较它们之间的时间。
硬件方面,我会创建一个虚拟机,这样硬件对查询性能的影响就不会那么大了。
这让我想到了时间测量。跨所有 DBMS 测量时间的最准确方法是什么? 每个 DBMS 都有自己的查询测量方式,但是每个 DBMS 的实现方式各不相同,我认为这不是用于比较的代表性数据。
MySQL:
SET profiling = 1;
select COUNT(id) from diplomska.`user`;
SHOW PROFILES;
|3 |1.404277ms |select COUNT(id) from diplomska.`user` u¶LIMIT 0, 200|
PostgreSQL
EXPLAIN ANALYSE select COUNT(id) from diplomska.`users`;
|Execution Time: 58.140 ms
甲骨文
declare
t1 timestamp;
t2 timestamp;
begin
t1 := systimestamp;
select COUNT(id) from diplomska.`users`
t2 := systimestamp;
dbms_output.put_line('Elapsed Seconds: '||TO_CHAR(t2-t1, 'SSSS.FF'));
end;
Elapsed Seconds: +000000 00:00:00.000091000
另一种选择是用某种编程语言(Python、C# 等)编写脚本,然后测量时间并执行查询。但这仍然让我们测量代码编译的时间、DBMS 控制器初始化和获取数据的时间,我们不能只隔离查询时间。
有什么建议吗?
如果您从 dbms 客户端软件进行测量,那么您只能以黑盒方式测量一些东西。
您可以测量这些经过的时间:
- 正在建立连接。
- 准备查询(一些 DBMS 参与准备阶段;其他则全部在客户端完成)。
- 从查询提交到结果集第一行的时间。
- 完成查询的时间 -- 到结果集的最后一行。
当您的测试查询 return 具有许多行的结果集时,最后两者之间的差异很明显。
我不明白如何在不使用某种编程测试工具的情况下准确测量这些数字。您可能会考虑使用 php 及其 PDO 数据库访问包,因为它有 a whole mess of drivers 用于不同的数据库。
而且,我相信你知道:
- 一些数据库可以从它们保留的内部 table 元数据中即时回答
COUNT(id) FROM tbl
之类的问题。这因数据库和版本而异。 - 索引可以将查询性能改变数千倍。
- 在现实世界中,当多个客户端同时使用服务器时,通常会出现数据库性能问题。
在所有列出的 DBMS 中,除了 SQLite 支持下一个代码:
-- create service table which will store data
CREATE TABLE service (id INT, stamp TIMESTAMP(3));
-- store timestamp before test query execution
INSERT INTO service (id, stamp) VALUES (1, CURRENT_TIMESTAMP(3));
-- execute query to test
-- SELECT ... ;
-- store timestamp after test query execution
INSERT INTO service (id, stamp) VALUES (2, CURRENT_TIMESTAMP(3));
-- retrieve elapsed time
SELECT t1.stamp - t2.stamp elapsed
FROM service t1
CROSS JOIN service t2
WHERE t1.id = 2 AND t2.id = 1;
sample fiddle - 您可以使用 MySQL、MariaDB、Oracle、PostgreSQL 进行测试。