- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
本文末尾附加的 Python3 脚本创建了一个包含 5 个 INT
列的简单表,其中 3 个带有索引。
然后它使用 multi-row inserts 来填充表格。
一开始,它每秒能够插入大约 10000 行。
Took 0.983 s to INSERT 10000 rows, i.e. performance = 10171 rows per second.
Took 0.879 s to INSERT 10000 rows, i.e. performance = 11376 rows per second.
Took 0.911 s to INSERT 10000 rows, i.e. performance = 10982 rows per second.
Took 1.180 s to INSERT 10000 rows, i.e. performance = 8477 rows per second.
Took 1.030 s to INSERT 10000 rows, i.e. performance = 9708 rows per second.
Took 1.114 s to INSERT 10000 rows, i.e. performance = 8975 rows per second.
但是当表已包含大约 1000000 行时,性能会下降到每秒大约 2000 行。
Took 3.648 s to INSERT 10000 rows, i.e. performance = 2741 rows per second.
Took 3.026 s to INSERT 10000 rows, i.e. performance = 3305 rows per second.
Took 5.495 s to INSERT 10000 rows, i.e. performance = 1820 rows per second.
Took 6.212 s to INSERT 10000 rows, i.e. performance = 1610 rows per second.
Took 5.952 s to INSERT 10000 rows, i.e. performance = 1680 rows per second.
Took 4.872 s to INSERT 10000 rows, i.e. performance = 2053 rows per second.
作为比较:当使用 PostgreSQL 而不是 CockroachDB 时,性能始终约为每秒 40000 行。
Took 0.212 s to INSERT 10000 rows, i.e. performance = 47198 rows per second.
Took 0.268 s to INSERT 10000 rows, i.e. performance = 37335 rows per second.
Took 0.224 s to INSERT 10000 rows, i.e. performance = 44548 rows per second.
Took 0.307 s to INSERT 10000 rows, i.e. performance = 32620 rows per second.
Took 0.234 s to INSERT 10000 rows, i.e. performance = 42645 rows per second.
Took 0.262 s to INSERT 10000 rows, i.e. performance = 38124 rows per second.
Took 0.301 s to INSERT 10000 rows, i.e. performance = 33254 rows per second.
Took 0.220 s to INSERT 10000 rows, i.e. performance = 45547 rows per second.
Took 0.260 s to INSERT 10000 rows, i.e. performance = 38399 rows per second.
Took 0.222 s to INSERT 10000 rows, i.e. performance = 45136 rows per second.
Took 0.213 s to INSERT 10000 rows, i.e. performance = 46950 rows per second.
Took 0.211 s to INSERT 10000 rows, i.e. performance = 47436 rows per second.
使用 CockroachDB 时有没有办法提高性能?
由于表是连续填充的,因此不能先填充表,然后再添加索引。
db_insert_performance_test.py
:
import random
from timeit import default_timer as timer
import psycopg2
def init_table(cur):
"""Create table and DB indexes"""
cur.execute("""
CREATE TABLE entities (a INT NOT NULL, b INT NOT NULL,
c INT NOT NULL, d INT NOT NULL,
e INT NOT NULL);""")
cur.execute('CREATE INDEX a_idx ON entities (a);')
cur.execute('CREATE INDEX b_idx ON entities (b);')
cur.execute('CREATE INDEX c_idx ON entities (c);')
# d and e does not need an index.
def create_random_event_value():
"""Returns a SQL-compatible string containing a value tuple"""
def randval():
return random.randint(0, 100000000)
return f"({randval()}, {randval()}, {randval()}, {randval()}, {randval()})"
def generate_statement(statement_template, rows_per_statement):
"""Multi-row insert statement for 200 random entities like this:
INSERT INTO entities (a, b, ...) VALUES (1, 2, ...), (6, 7, ...), ...
"""
return statement_template.format(', '.join(
create_random_event_value()
for i in range(rows_per_statement)))
def main():
"""Write dummy entities into db and output performance."""
# Config
database = 'db'
user = 'me'
password = 'pwd'
host, port = 'cockroach-db', 26257
#host, port = 'postgres-db', 5432
rows_per_statement = 200
statements_per_round = 50
rounds = 100
statement_template = 'INSERT INTO entities (a, b, c, d, e) VALUES {}'
# Connect to DB
conn = psycopg2.connect(database=database, user=user, password=password,
host=host, port=port)
conn.set_session(autocommit=True)
cur = conn.cursor()
init_table(cur)
for _ in range(rounds):
# statements_per_round multi-row INSERTs
# with rows_per_statement rows each
batch_statements = [generate_statement(statement_template,
rows_per_statement)
for _ in range(statements_per_round)]
# Measure insert duration
start = timer()
for batch_statement in batch_statements:
cur.execute(batch_statement)
duration = timer() - start
# Calculate performance
row_count = rows_per_statement * statements_per_round
rows_per_second = int(round(row_count / duration))
print('Took {:7.3f} s to INSERT {} rows, '
'i.e. performance = {:>6} rows per second.'
''.format(duration, row_count, rows_per_second), flush=True)
# Close the database connection.
cur.close()
conn.close()
if __name__ == '__main__':
main()
为了快速重现我的结果,这里有一个docker-compose.yml
:
version: '2.4'
services:
cockroach-db:
image: cockroachdb/cockroach:v2.0.3
command: start --insecure --host cockroach-db --vmodule=executor=2
healthcheck:
test: nc -z cockroach-db 26258
cockroach-db-init:
image: cockroachdb/cockroach:v2.0.3
depends_on:
- cockroach-db
entrypoint: /cockroach/cockroach sql --host=cockroach-db --insecure -e "CREATE DATABASE db; CREATE USER me; GRANT ALL ON DATABASE db TO me;"
postgres-db:
image: postgres:10.4
environment:
POSTGRES_USER: me
POSTGRES_PASSWORD: pwd
POSTGRES_DB: db
healthcheck:
test: nc -z postgres-db 5432
db-insert-performance-test:
image: python:3.6
depends_on:
- cockroach-db-init
- postgres-db
volumes:
- .:/code
working_dir: /
entrypoint: bash -c "pip3 install psycopg2 && python3 code/db_insert_performance_test.py"
要开始测试,只需运行docker-compose up db-insert-performance-test
。
最佳答案
CockroachDB 将数据存储在“范围”内,当范围达到 64MB 时,范围就会被分割。最初,该表适合一个范围,因此每次插入都是单范围操作。 Range拆分后,每次插入都需要涉及多个Range来更新表和索引;因此,预计性能会下降。
关于sql - 如何提高 CockroachDB 的 INSERT 性能(每秒行数)(与 PostgreSQL 相比大约慢 20 倍),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51000680/
这个问题在这里已经有了答案: 11年前关闭。 Possible Duplicate: Haskell: difference between . (dot) and $ (dollar sign) 好
我对 Java 平台没有任何了解,我想知道可以使用哪些工具(和方法)来帮助开发用 Java 编写的可维护代码。 我知道可以使用: 适用于任何环境的敏捷方法 用于单元测试代码的 jUnit/jMock(
我们的产品需要支持 IE9,但我们一直假设 IE9 支持 IE10+ CSS 规则。 是否有一种巧妙的方法来获取在 IE10+ 中有效但在 IE9 中不受支持的所有 CSS 规则,目的是在静态代码分析
我需要为 MyString 类重载运算符 + 和 +=。 MyString.h class MyString { char* m_pStr; }; 主要
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在升级现有的旧代码以使用 VS 2019*,在代码中我有以下函数在返回行失败: int foo(const char *fn) const { ofstream out(fn,ios::b
我想使用 R2D3 pacakge 在 R 中,但我不确定这个包与 D3.js 库的关系。 R2D3 是否以任何方式限制 D3 的功能?我们可以将 R 中的所有 D3 功能和特性与 R2D3 一起使用
我正在使用 WPF 语音识别库,试图在桌面应用程序中使用它来替代菜单命令。 (我想专注于没有键盘的平板电脑体验)。它可以工作 - 有点,除了识别的准确性太差以至于无法使用。所以我试着听写到 Word。
我在学校参加数据库类(class)。老师给了我们一个简单的练习:考虑以下简单的模式: Table Book: Column title (primary key) Column gen
我正在尝试学习 MVVM 模式,特别是当 View 表示数据库表时该怎么做,但 View 有几个元素表示单个数据库字段。举个简单的例子: 假设我有一个 DateTime 类型的数据库字段(每个数据库字
我有两张 table 。表单有约 77000 行。日志约有 270 万行。 以下查询将在不到一秒的时间内返回“30198”: SELECT COUNT(DISTINCT logs.DOCID) FRO
当您在 Eviews 中进行回归时,您会得到一组这样的统计数据: 在 R 中有没有一种方法可以在一个列表中获得所有/大部分关于 R 回归的统计数据? 最佳答案 请参阅summary,它将为大多数回归对
如果我枚举 type XType int const ( X1 XType = iota X2 ... Xn ) var XTypeNames = []string{"x1", "x2
我正在试用 ranger R包加速做了很多randomForest计算。我正在检查我从中得到的预测,并注意到一些有趣的事情,因为所做的预测完全不正确。 以下是比较 randomForest 的可重现示
我发现 Clang 编译速度比 GCC 慢了四倍。知道是什么原因造成的吗? ebg@tsuki(250)$ time /usr/bin/cc -DHC4 -DSAFETY -DNOREDUCE -DN
我注意到在尝试以 JSON 格式发布表单数据时,以下内容不起作用: $.ajax({ type: "POST", url: url, data: JSON.string
我的代码库中有很多 #if DEBUG/#endif 语句,它们大多具有断言类型逻辑,我不敢在生产环境中运行这些逻辑。 [Conditional("DEBUG")] public void Check
所以我正在开发一个平方根计算器,但我不知道 while 循环是否比 do while 循环更适合。 double x, y = 1.0, newY, squareRoot; bool
我有两个列表,一个是所有语言,另一个是网站拥有的语言子集,我的想法是返回所有语言,但如果子集的元素对应于所有语言的列表,则更改 bool 值的属性. 语言的DTO: public class DTOL
以下控制台应用程序运行正常 - 我很惊讶它没有出错。 class DelegateExperiments { //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
我是一名优秀的程序员,十分优秀!