我们有一个大约10 k行的表,使用以下方案:
- item_id:TEXT(主键)
- xml_1:XML
- xml_2:XML
1.国家:TEXT
运行以下查询大约需要9到10秒:
SELECT * FROM info_table
WHERE item_id IN ('item1','item2','...' -> 'item2000')
我们的每个SELECT查询都是由一个大约2,000+个项目id(字符串)的数组组成的,这个查询非常简单,我们希望优化它(如果可能的话)。每一行的XML大小在100 Kb左右
如果有帮助的话,我们的查询是在Node.JS中使用Knex完成的,比如:
client.select('*').from('info_table').where('item_id','in',ids)
服务器使用PostgreSQL 14托管于GCP Cloud SQL,2 vCPU,8 GB内存,100 GB SSD
解释结果(分析,缓冲液):
Seq Scan on epg_test (cost=4.85..740.17 rows=1939 width=601) (actual time=0.168..3.432 rows=1837 loops=1)
Filter: (epg_id = ANY (Array of 2000 IDs)
Rows Removed by Filter: 6051
Buffers: shared hit=617
Planning:
Buffers: shared hit=130
Planning Time: 1.999 ms
Execution Time: 3.590 ms
有什么办法吗?
2条答案
按热度按时间f5emj3cl1#
从您的问题和评论中,很明显您的查询的PostgreSQL复杂性是最小的。它需要不到4 ms。因此,索引或其他SQL调优不是解决方案的一部分。
很明显,您将返回一个很大的结果集,总计大约0.2GiB。而且,你在十秒左右的时间里就做到了。这意味着您的吞吐量是20 MiB/秒,这是非常好的。如果您要从位于GCP某处的服务器将其检索到您所在地的机器中,则尤其如此。(请记住,每秒20 megaBYTES需要每秒160 megaBITS以上。从一台机器推送到另一台机器需要占用大量带宽。)
如何更快地完成大数据传输?
1.更多带宽。你得和你的运营人员谈谈。或者通过在网络上将运行查询的机器移动到更靠近数据库机器的位置。
1.压缩传输中的数据。XML通常是相当可压缩的(信息-理论上它几乎是病态的冗长)。nodejs(和knex)的PostgreSQL驱动程序有一个已弃用的sslcompression connection-string标志,它将对客户端-服务器网络流量应用无损压缩。那可能会有帮助。
或者,您可以通过使用-C -- compressed protocol --标志设置的ssh会话来建立数据库连接。
1.压缩数据库中的静态数据。如果这样做,请确保将压缩的xml存储在具有二进制数据类型的列中。
话虽如此,10秒钟处理这么多数据似乎并不完全不合理。
hgb9j2n62#
谢谢大家的投入,这是非常有帮助的。
我们通过在插入到PostgreSQL之前压缩XML数据,使查询时间缩短到2秒,从而大大减少了数据的大小。
我们使用“zlib”和GZIP压缩XML。