postgresql - 我如何使这个 Golang 到 Postgres 的查询更快?有什么具体的选择吗?

标签 postgresql go

我正在使用 Golang 和 Postgres 来过滤一些财务数据。我有一个 Postgres 数据库,它有一个包含单个股票市场的表(如果这是正确的术语)。此表包含 ID、代码、日期、开盘价、最高价、最低价、收盘价和交易量的列。总行数为 6,610,598,不同股票(代码)的数量为 2174。

现在我要做的是从那个表中过滤数据,然后保存到另一个表中。所以第一个包含原始数据,第二个包含清理后的数据。

我们有三个参数,一个日期 (EVALDATE) 和两个整数 (MINCTD & MINDP)。首先,我们必须只选择那些将通过我们的最小日历交易日参数的股票。所以这将被选择(注意:我们为此使用 golang)

symbols []string got its value from ( Select distinct symbol from table_name; )
[]filteredSymbols
var symbol, date string
var open, high, low, close float64
var volume int
for _, symbol := range symbols {
    var count int
    query := fmt.Sprintf("Select count(*) from table_name where symbol = '%s' and date >= '%s';", symbol, EVALDATE)
    row := db.QueryRow(query)
    if err := row.Scan(&count); err != nil ........
    if count >= MINCTD
        filteredSymbols = append(filteredSymbols, symbol)
}

基本上,上面的操作只要求那些从 EVALDATE 到当前日期(数据中的最新日期)具有足够行数的符号,以满足 MINCTD。以上操作耗时30分钟

如果符号满足上面的第一个过滤器,它将进行第二个过滤器,该过滤器将测试在该时间段内(EVALDATE 到 LATEST_DATE)是否有足够的行包含完整数据(没有 OHLC 没有值)。所以下面的查询用于过滤通过上面过滤器的符号:

Select count(*) from table_name where symbol='symbol' and date>= 'EVALDATE' and open != 0 and high != 0 and low != 0 and close != 0;

此查询耗时 36 分钟

在获得通过两个过滤器的符号 slice 后,我将使用 postgres 查询再次获取它们的数据,然后开始批量插入到另一个表。

所以1小时6分钟不是很能接受。那我该怎么办?抓取所有数据然后在内存中使用 Golang 进行过滤?

最佳答案

我从问题中注意到的几件事。

尽量避免扫描超过 600 万行以达到 2174 个值(即避免 Select distinct symbol from table_name;)。您没有(或可以构建)带有符号主键的符号“主表”吗?

结合您的查询来测试如下数据:

select
       count(*) c1
     , count(case when open != 0 and high != 0 and low != 0 and close != 0 then 1 end) as c2
from table_name 
where symbol='symbol' 
and date>= 'EVALDATE' 

(符号,日期)上的索引将有助于提高性能。

关于postgresql - 我如何使这个 Golang 到 Postgres 的查询更快?有什么具体的选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47916809/

相关文章:

go - LiteIDE 是否支持 "go to previous"快捷方式?

sql - Heroku Postgres 上 SQL 查询中的字符串比较

postgresql - 表约束中不存在 postgres 键

postgresql - 使用 sudo 启动 Postgresql 时出现问题

python - mock psycopg2 - 如何引发异常?

debugging - Npgsql - 不支持指定的方法

go - 调用接受 "chan interface{}"的函数

go - 如何向 fyne UI 应用程序添加填充、字体大小和颜色

go - golang 是否有这个 Python 短路习语 `z = x or y` 的等价物

http - 如何用go语言为http客户端设置套接​​字选项(IP_TOS)?