Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
CSDN 技术社区
skill_tree_pg
提交
79c2b029
S
skill_tree_pg
项目概览
CSDN 技术社区
/
skill_tree_pg
通知
9
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
2
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
skill_tree_pg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
2
Issue
2
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
79c2b029
编写于
11月 15, 2021
作者:
M
Mars Liu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add some perfomance exercises
上级
a5be91aa
变更
9
显示空白变更内容
内联
并排
Showing
9 changed file
with
228 addition
and
2 deletion
+228
-2
data/2.PostgreSQL中阶/1.PostgreSQL数据库的基本结构/3.用户和权限/config.json
data/2.PostgreSQL中阶/1.PostgreSQL数据库的基本结构/3.用户和权限/config.json
+6
-1
data/2.PostgreSQL中阶/1.PostgreSQL数据库的基本结构/3.用户和权限/revoke.json
data/2.PostgreSQL中阶/1.PostgreSQL数据库的基本结构/3.用户和权限/revoke.json
+7
-0
data/2.PostgreSQL中阶/1.PostgreSQL数据库的基本结构/3.用户和权限/role.json
data/2.PostgreSQL中阶/1.PostgreSQL数据库的基本结构/3.用户和权限/role.json
+7
-0
data/2.PostgreSQL中阶/1.PostgreSQL数据库的基本结构/4.索引和约束/auto_id.json
.../2.PostgreSQL中阶/1.PostgreSQL数据库的基本结构/4.索引和约束/auto_id.json
+0
-0
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/config.json
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/config.json
+5
-1
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/daily_payment.json
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/daily_payment.json
+7
-0
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/daily_payment.md
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/daily_payment.md
+81
-0
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/daily_payment_2.json
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/daily_payment_2.json
+7
-0
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/daily_payment_2.md
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/daily_payment_2.md
+108
-0
未找到文件。
data/2.PostgreSQL中阶/1.PostgreSQL数据库的基本结构/3.用户和权限/config.json
浏览文件 @
79c2b029
...
@@ -2,5 +2,9 @@
...
@@ -2,5 +2,9 @@
"node_id"
:
"pg-cb942198b3a84d5398d73d558a241543"
,
"node_id"
:
"pg-cb942198b3a84d5398d73d558a241543"
,
"keywords"
:
[],
"keywords"
:
[],
"children"
:
[],
"children"
:
[],
"export"
:
[]
"export"
:
[
"grant.json"
,
"revoke.json"
,
"role.json"
]
}
}
\ No newline at end of file
data/2.PostgreSQL中阶/1.PostgreSQL数据库的基本结构/3.用户和权限/revoke.json
浏览文件 @
79c2b029
{
"type"
:
"code_options"
,
"author"
:
"刘鑫"
,
"source"
:
"revoke.md"
,
"notebook_enable"
:
false
}
\ No newline at end of file
data/2.PostgreSQL中阶/1.PostgreSQL数据库的基本结构/3.用户和权限/role.json
浏览文件 @
79c2b029
{
"type"
:
"code_options"
,
"author"
:
"刘鑫"
,
"source"
:
"role.md"
,
"notebook_enable"
:
false
}
\ No newline at end of file
data/2.PostgreSQL中阶/1.PostgreSQL数据库的基本结构/4.索引和约束/auto_id.json
0 → 100644
浏览文件 @
79c2b029
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/config.json
浏览文件 @
79c2b029
...
@@ -2,5 +2,8 @@
...
@@ -2,5 +2,8 @@
"node_id"
:
"pg-79fe660f35f4469481db38509343c2b7"
,
"node_id"
:
"pg-79fe660f35f4469481db38509343c2b7"
,
"keywords"
:
[],
"keywords"
:
[],
"children"
:
[],
"children"
:
[],
"export"
:
[]
"export"
:
[
"daily_payment.json"
,
"daily_payment_2.json"
]
}
}
\ No newline at end of file
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/daily_payment.json
0 → 100644
浏览文件 @
79c2b029
{
"type"
:
"code_options"
,
"author"
:
"刘鑫"
,
"source"
:
"daily_payment.md"
,
"notebook_enable"
:
false
}
\ No newline at end of file
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/daily_payment.md
0 → 100644
浏览文件 @
79c2b029
# 每日报表
数据分析组需要经常执行以下查询生成从昨天到之前某一天的交易量统计
```
postgresql
select payment_date::date as day, sum(amount)
from payment
where (payment_date::date) between $1 and 'yesterday'::date
group by payment_date::date;
```
现在这个查询很慢,payment 表的信息如下:
```
text
Table "public.payment"
Column | Type | Collation | Nullable | Default
--------------+-----------------------------+-----------+----------+---------------------------------------------
payment_id | integer | | not null | nextval('payment_payment_id_seq'::regclass)
customer_id | smallint | | not null |
staff_id | smallint | | not null |
rental_id | integer | | not null |
amount | numeric(5,2) | | not null |
payment_date | timestamp without time zone | | not null |
Indexes:
"payment_pkey" PRIMARY KEY, btree (payment_id)
```
应该如何优化这个查询?
## 答案
建立表达式索引
```
postgresql
create index on payment((payment_date::date));
```
## 选项
### 对性能优化并无帮助
建立视图
```
postgresql
create view view_daily_payment as select payment_date::date as day, amount from payment;
```
然后在视图 view_daily_payment 上执行
```
postgresql
select day, sum(amount)
from view_daily_payment
where day between $1 and 'yesterday'::date
group by day
```
### 对该查询帮助不大
在 payment_date 列上建立索引
```
postgresql
create index on payment(payment_date);
```
### 可以简化语句,但对优化没有帮助
建立计算列
```
postgresql
alter table payment add day date generated always as ( payment_date::date ) stored
```
然后使用它改写查询
```
postgresql
select day as day, sum(amount)
from payment
where day between $1 and 'yesterday'::date
group by day;
```
\ No newline at end of file
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/daily_payment_2.json
0 → 100644
浏览文件 @
79c2b029
{
"type"
:
"code_options"
,
"author"
:
"刘鑫"
,
"source"
:
"daily_payment_2.md"
,
"notebook_enable"
:
false
}
\ No newline at end of file
data/3.PostgreSQL高阶/3.SQL高级技巧/4.索引和优化/daily_payment_2.md
0 → 100644
浏览文件 @
79c2b029
# 每日报表优化
# 每日报表
统计过去一段时间的数据,你发现 payment 表上每天的订单量很大,下面这个查询的统计过程占用了大多数数据库资源,查询不会
早止当天,总是在历史上某一个日期段内查询
```
postgresql
select payment_date::date as day, sum(amount)
from payment
where (payment_date::date) between $1 and $2
group by payment_date::date;
```
payment 表的信息如下:
```
text
Table "public.payment"
Column | Type | Collation | Nullable | Default
--------------+-----------------------------+-----------+----------+---------------------------------------------
payment_id | integer | | not null | nextval('payment_payment_id_seq'::regclass)
customer_id | smallint | | not null |
staff_id | smallint | | not null |
rental_id | integer | | not null |
amount | numeric(5,2) | | not null |
payment_date | timestamp without time zone | | not null |
Indexes:
"payment_pkey" PRIMARY KEY, btree (payment_id)
```
怎样做是最有效的?
## 答案
建立物化视图并建立索引。
```
postgresql
create materialized view view_daily_payment as
select payment_date::date as day, sum(amount) as amount from payment group by day;
create index on view_daily_payment(day);
```
使用
```
postgresql
select day, amount from view_daily_payment where day between $1 and $2;
```
进行查询。并且每天定时执行一次刷新命令
```
postgresql
REFRESH MATERIALIZED VIEW view_daily_payment;
```
## 选项
### 不会优化 sum 和 group by
在 payment_date 列上建立索引
```
postgresql
create index on payment(payment_date);
```
### 不会优化 sum
建立计算列
```
postgresql
alter table payment add day date generated always as ( payment_date::date ) stored
```
然后使用它改写查询
```
postgresql
select day as day, sum(amount)
from payment
where day between $1 and 'yesterday'::date
group by day;
```
### 优化了日期查询,但是不会优化统计过程
建立表达式索引
```
postgresql
create index on payment((payment_date::date));
```
### 不做物化,对查询速度不会有显著改善
建立视图
```
postgresql
create view view_daily_payment as select payment_date::date as day, amount from payment;
```
然后在视图 view_daily_payment 上执行
```
postgresql
select day, sum(amount)
from view_daily_payment
where day between $1 and 'yesterday'::date
group by day
```
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录