请原谅我对索引和数据库非常陌生。我有一个包含如下列的表:
date timestamp without time zone,
date_num bigint,
value double precision,
name text,
market text,
type text,
UNIQUE(name,date_num)
这个表是:
- 几乎没有更新,每天只更新一次,每个名字一个新行。
- 有600 - 1000万行
- 对于列
name
,有许多行,每一行代表一年中唯一的一天。例如,name
'companyA'有1250行,每一行都有一个唯一的日期/date_num。 date_num
是一年中某一天的毫秒时间戳,我们使用它进行搜索,有时我们使用date
。
我们搜索的内容之一是"找到日期之间收入最高的名称";,这意味着对于name
= &;公司a &;我们将计算:
revenue = (`value` of companyA in 14/2/2022 - `value` of companyA in 14/2/2021)
我们需要找到收益最高的50个names
。
由于某些原因,这项任务需要13秒,而我看到其他人在1秒内完成。
- 对于这种情况,哪些指标是合理的?
- 如果我们需要找到/计算像这样的
date/name/value
的许多变化,哪些索引是好的?
这里有一个查询,需要查找某个type
的所有names
的收入。这个查询并不理想,因为它服务于许多类型的查询,并且最初包含用于更改每个查询的sql字符串的参数
WITH BS AS (
SELECT date_num, name, value,
first_value(value) over (PARTITION BY name ORDER BY date_num) as o,
first_value(value) over (PARTITION BY name ORDER BY date_num DESC) as c,
ROW_NUMBER() OVER (PARTITION BY name ORDER BY date_num DESC) as rn
FROM historical
WHERE date_num >= 1609459200 AND date_num <= 1640995200 AND type = 'typeA'
)
SELECT name, date_num, CASE WHEN o=0 THEN null ELSE 100 * ( (c - o)/o ) END as out_return
FROM BS
WHERE BS.rn = 1
ORDER BY out_return DESC NULLS LAST
LIMIT 50
PS—type
列对于95%的表具有特定的值,而对于其他5%只有其他值。
为这个查询建立索引的最好方法是在(type, date_num)
上建立索引。不要将时间戳存储为数字。