说明:
1、my_db.stock_tb: 是一个22亿行,大约15列的大表且是单一表,压缩后的空间在50G,压缩率约30倍;
此表存了2010年以来的所有A股的1分钟线数据。为什么要设计成单一表,主要也就是想做一下压测。
2、我在家用电脑中WSL2下进行的单机方式测试,内存32G。
3、未作分区安排[特别说明]
下面就上述表进行简单测试。
1、LIMIT N测试
def get_data_from_ch(): # startdate : 2010-01-01
client = Client('localhost')
database_name = "my_db"
table_name = 'stock_tb'
code = "600036.XSHG"
query_sql = f'SELECT * FROM {database_name}.{table_name} LIMIT 10000000'
print(query_sql)
data = client.execute(query_sql)
return data
t0 = time.time()
data = get_data_from_ch()
t1 = time.time()
print(f"get_data cost time : {t1-t0} s! ")
进行了不同LIMIT次数的测试:
python端:
clickhouse-client端:
2、条件查询测试
(1)、单条件
def get_data_from_ch(): # startdate : 2010-01-01
client = Client('localhost')
database_name = "my_db"
table_name = 'stock_tb'
code = "600036.XSHG"
query_sql = f"SELECT * FROM {database_name}.{table_name} WHERE code = '{code}' LIMIT 10"
print(query_sql)
data = client.execute(query_sql)
return data
t0 = time.time()
data = get_data_from_ch()
t1 = time.time()
print(f"get_data cost time : {t1-t0} s! ")
(2)、标的和日期的多条件查询
def get_data_from_ch_by_code_and_datetime():
client = Client('localhost')
database_name = "my_db"
table_name = 'stock_tb'
startdate = "2018-01-01"
enddate = "2022-02-02"
code = "600036.XSHG"
query_sql = f"SELECT * FROM {database_name}.{table_name} WHERE code ='{code}' AND toDate(datetime) >= toDate('{startdate}') AND toDate(datetime) <= toDate('{enddate}') "
print(query_sql)
data = client.execute(query_sql)
print(f"data : {len(data)}")
return data
t0 = time.time()
data = get_data_from_ch_by_code_and_datetime()
t1 = time.time()
print(f"get_data cost time : {t1-t0} s! ")
python端:
clickhouse端:
(3) 跨品种查询
f"SELECT * FROM {database_name}.{table_name} WHERE toDate(datetime) >= toDate('{startdate}') AND toDate(datetime) <= toDate('{enddate}') "
换了不同的时段,速度基本差不多。相当于查询近一年的全A股市 的数据花的时间。
目前看,总体还算凑合,当然其主要优势在于跨品种查询上优势还是比较明显;但单一品种的查询优势不太明显。
但在小样本数据的查询上,比如对于某个标的,需要查5-10万量级的数据,这个优势不太明显。这种感觉更适合TDengine的场景。
还有哪些可以提高性能优化的点? 分库分表?异步读取?