简单的SELECT(*)查询在Apache Ignite中非常慢

时间:2019-06-25 14:23:27

标签: sql performance key-value ignite in-memory-database

我正在为新产品使用Apache Ignite制作原型。我需要在内存中存储一​​个非常宽的矩阵,并访问各种随机行和列。矩阵具有50,000列和潜在的数百万行。矩阵基本上是只读的,因此我们不必担心写入速度。

我们永远不需要订购结果。客户端应用程序将通过主键请求特定的行,并可能请求某些列,有时还会请求整个行。

我将数据加载到Apache Ignite的SQL表中,如下所示:

CREATE TABLE myMatrix
name CHAR(20) PRIMARY KEY,
col1 INT,
col2 INT,
col3 INT,
...
col50000 INT

我也为“名称”列建立了索引

CREATE INDEX name_index ON myMatrix(name)

但是,当我尝试仅选择一行时,要花10秒钟以上的时间才能返回结果。我们需要更快得多的响应时间-客户将在不到一秒钟的时间内获得一组行(可能是几百或数千个)和列(最多是所有列)的信息。

import pandas as pd
import pyignite
from pyignite import Client
import time

client = Client()

client.connect('127.0.0.1', 10800)

now = time.time()
result = client.sql('SELECT * FROM full_test_table WHERE      name=\'F1S4_160106_058_G01\'')
print('Got Result in')
print(time.time() - now)

为什么这样这么慢?我希望将整个表保存在内存中会带来更快的结果。只是表格的宽度会引起问题吗?

该数据库在具有32个内核和244GB内存的r4.8xlarge实例上运行。

3 个答案:

答案 0 :(得分:1)

我尝试运行一个与您的示例非常相似的示例,结果发现Ignite的SQL解析器(基于H2 SQL解析器)具有响应列数的二次性能兼容。这意味着在Ignite的表中拥有50,​​000列是完全不可行的。我将尝试针对H2错误跟踪器提出问题。

上一个答案:

  

您是否有持久性,还是RAM中的所有内容?我只是不明白为什么要花这么长时间。也许存在一些内联问题-您是否尝试过CREATE INDEX name_index ON myMatrix(name) INLINE_SIZE 25

     

第二,拥有50,​​000列不是最佳选择。最好使用数组。

答案 1 :(得分:0)

这不完全是答案,但是我看到了您以前的问题,现在我看到您正在使用熊猫。如果您只是腌制矩阵(我想应该是NumPy / pandas Array)并将其作为ByteArrayObject放在Ignite缓存中,然后在使用前将其解开到pandas.Array怎么办?它将总体上解决您的问题吗?

如果可以的话,这里有一点评论。 ByteArrayObject在当前版本中非常慢,但是我已经进行了改进,并且修复程序正等待包含在下一版本中。如果需要将它们打包,请写信给我。

还有Apache Ignite Users邮件列表。您可以在那里订阅并讨论您的任务。

答案 2 :(得分:0)

基于@alamar's analysis,如果您真的无法摆脱成千上万的列,我建议您使用k-v API:https://apacheignite.readme.io/docs/python-thin-client-key-value

已经说过,在缓存/表中具有50,000列将是一个更好的解决方案。