当我尝试对数据库执行查询时,我有一堆正在运行的sidekiq作业失败并出现以下错误:
No server is available matching preference: #<Mongo::ServerSelector::Primary:0x70249928071560 tag_sets=[] server_selection_timeout=30 local_threshold=0.015>
Run Code Online (Sandbox Code Playgroud)
这似乎是随机发生的,而不是所有的时间.我的mongoid.yml结构如下:
hosts:
- XX.XXX.XXX.X:27000
- XX.XXX.XXX.XXX:27000
database: acbde__production
options:
connect_timeout: 20
read:
mode: :secondary
max_pool_size: 800
replica_set: acbdeReplset
Run Code Online (Sandbox Code Playgroud)
以前有人有过这个问题吗?
当具有 NULL 值时,我在生成查询以将 JSON 数组显示为一组文本值时遇到问题。假设我有下表:
Name | Meta
Art0 | {"category":["sport"]}
Art1 | [NULL]
Art2 | {"category":["sport", "health"]}
Run Code Online (Sandbox Code Playgroud)
如果我做类似的事情:
SELECT name, jsonb_array_elements_text(meta->'category') tag FROM table
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
Name | Tag
Art0 | sport
Art2 | sport
Art2 | health
Run Code Online (Sandbox Code Playgroud)
问题是 Art1 正在被删除。如何执行还包含 Art1 行以及 Tag 列上的空字符串或 NULL 值的查询?
谢谢
我在表上执行第一个查询时遇到了麻烦。后续查询要快得多,即使我更改了要查找的范围日期。我假设 PostgreSQL 实现了一种缓存机制,可以让后续查询更快。我可以尝试预热缓存,以便第一个用户请求可以访问缓存。但是,我认为我可以以某种方式改进以下查询:
SELECT
y.id, y.title, x.visits, x.score
FROM (
SELECT
article_id, visits,
COALESCE(ROUND((visits / NULLIF(hits ,0)::float)::numeric, 4), 0) score
FROM (
SELECT
article_id, SUM(visits) visits, SUM(hits) hits
FROM
article_reports
WHERE
a.site_id = 'XYZ' AND a.date >= '2017-04-13' AND a.date <= '2017-06-28'
GROUP BY
article_id
) q ORDER BY score DESC, visits DESC LIMIT(20)
) x
INNER JOIN
articles y ON x.article_id = y.id
Run Code Online (Sandbox Code Playgroud)
关于如何改进这一点的任何想法。以下是 EXPLAIN 的结果:
Nested Loop (cost=84859.76..85028.54 rows=20 width=272) (actual time=12612.596..12612.836 rows=20 loops=1)
-> Limit (cost=84859.34..84859.39 rows=20 …Run Code Online (Sandbox Code Playgroud)