我有一个场景,我需要运行工资报告。该报告计算特定日期范围内按员工分组的工资金额。
例如,当运行 2016-11-01 到 2016-11-30 的报告时,我会看到以下结果:
Staff Id Total
------------------
1 123.00
2 439.22
Run Code Online (Sandbox Code Playgroud)
我对上述报告使用以下查询:
select
user_id as staff_id,
sum(amount) as total
from transaction
where
business_id = <business_id> and
type = 'staff' and
kind = 'commission' and
created_at between <start_date> and <end_date>
group by
user_id;
Run Code Online (Sandbox Code Playgroud)
我正在尝试根据以下要求确定优化此查询性能的最佳方法:
business_id、start_date和end_date看来视图和函数都可以完成这项工作,但我并不能 100% 确定哪种方法是考虑到需求的最佳方法。
旁注:如果能够根据上面提到的参数来缓存数据就太好了,但是数据库方面似乎没有很好的解决方案。如我错了请纠正我!
附加信息:
business_id、type、kind和列上有索引。这些都是单列、btree 索引。user_idcreated_attransaction我的表上有 100 多个索引。我想临时禁用所有索引,并希望在索引完成后重新启用它们。
键入每个索引名称来禁用它是不可行的。是否有任何 PostgreSQL 语句可以临时禁用所有索引,然后再次重新启用它们。
问候,
所以我一直在使用 postgre 数据库,我注意到当我尝试读取 csv 文件并远程复制到表时,它有时会抛出错误。当我使用缓冲阅读器时它工作得很好,但我试图看看是否有办法让我使用数据库 COPY FROM 方法来工作。它在数据库所在的计算机上运行良好,但我的另一台计算机出现错误。
这一行出现错误:
st.execute("COPY inputdata FROM 'C:\\Users\\JAMES\\Downloads\\V24_Mike_110217_RemovedReturnTrips\\RyderCombiner\\AllNonMatchingWithColNames.csv' CSV HEADER DELIMITER ',';");
Run Code Online (Sandbox Code Playgroud)
这是我连接到数据库的地方:
Class.forName("org.postgresql.Driver");
Connection conn = DriverManager.getConnection("jdbc:postgresql://192.168.1.15:5432/postgres", "postgres", "pass");
Run Code Online (Sandbox Code Playgroud)
我在网上读到也许 STDIN 可以帮助我,但我无法让它工作,并且大多数在线示例都使用 pqsl。有没有办法让它工作或者我需要返回缓冲读者?
更新:
因此,我尝试使用 CopyManager API,但在尝试使用 DBUtil 建立连接时出现错误,因为即使我从以下网站下载了 jar 文件,它也无法识别:http ://commons.apache.org/proper/ commons-dbutils/download_dbutils.cgi
代码:
Connection connection = DBUtil.getConnection("POSTGRES");
String sql = "COPY inputdata FROM 'C:\\Users\\JAMES\\Downloads\\V24_Mike_110217_RemovedReturnTrips\\RyderCombiner\\AllNonMatchingWithColNames.csv' CSV HEADER DELIMITER ','";
CopyManager copyManager = new CopyManager((BaseConnection)connection);
copyManager.copyIn(sql);
Run Code Online (Sandbox Code Playgroud)
我在 DBUtil 的第一行收到错误...导入 jar 文件是使 jdbc 识别此变量的唯一方法吗?
更新2:
再次感谢大家,我最终通过遵循给定的链接和一些调整使复制工作正常。
public static void readInputData(String inputDataFile, Statement st) …Run Code Online (Sandbox Code Playgroud) 我在 Linux 机器上设置了 postgres 10.4,有时在 pg_hba.conf 顶部会随机出现一些规则,只允许用户“pgdbadm”进行 MD5 连接。我不确定数据库是否被黑,但在更改密码并检查 pgdbadm 不存在后,我仍然不时看到新规则。数据库是否有可能被泄露?
如果我没记错的话,这三个规则如下:
local all all 0.0.0.0/0 reject
host all postgres 0.0.0.0/0 reject
host all pgdbadm 0.0.0.0/0 md5
Run Code Online (Sandbox Code Playgroud)
任何关于正在发生的事情的解释以及潜在的解决方案将不胜感激。
编辑:我发现在设置 pg_hba.conf 时我使用了一个规则,所有连接都不需要密码。这可能允许机器人登录并创建不需要的数据库/其他东西,所以我将全新安装 Ubuntu 并备份数据库。
有什么方法可以在 postgresql 中获取主机名/服务器名,例如 SQL Server 中的 @@ServerName?
如果我在 Postgres 表中有一堆行,然后创建一个索引,如果在创建后插入新数据行,索引是否会自动更新?
或者说,REINDEX 是仅在一些罕见的情况下需要,还是在添加新数据时才需要?
我们在 PostgreSQL 的单个事务中执行大约 100k DDL 语句。在执行过程中,各个 Postgres 连接的内存使用量逐渐增加,一旦它无法获得更多内存(在 3GB 内存上从 10MB 使用量增加到 2.2GB),OOM 杀手用 9 命中它,导致 Postgres 进入恢复模式.
BEGIN;
CREATE SCHEMA schema_1;
-- create table stmts - 714
-- alter table add pkey stmts - 714
-- alter table add constraint fkey stmts - 34
-- alter table add unique constraint stmts - 2
-- alter table alter column set default stmts - 9161
-- alter table alter column set not null stmts - 2405
-- alter table add check …Run Code Online (Sandbox Code Playgroud) postgresql performance transaction ddl postgresql-9.6 postgresql-performance
最近apgcc,在我们测试的 Aurora Postgresql 集群(欧盟西部地区)的每个数据库中都出现了一个名为的神秘新模式。它归rdsadmin帐户所有。它是什么,它来自哪里?
我知道东京地区apgcc的发布公告中提到了。Twitter透露,这也发生在其他人身上。
我正在尝试在 Postgres 中创建一个函数,该函数可以遍历给定jsonb对象中的每个键/值对。
create or replace function myFunction
(input jsonb)
returns jsonb as $$
BEGIN
// foreach(key in input)
// do some math operation on its corresponding value
returns input;
END; $$
Run Code Online (Sandbox Code Playgroud)
参数输入应为 jsonb 对象,例如{"a":1, "b":2, "c":3}.
我想遍历对象中的每个键/值对。从我的评论中可以看出,我曾经使用更通用的编程语言(如 c、java 等)编写后端代码。所以我不擅长 SQL。我曾尝试在线搜索,但他们谈论如何遍历jsonb数组而不是对象。所以真的卡在这里了。
我无法让我的第一个存储过程工作,所以我从手册中复制了这个例子:
CREATE PROCEDURE insert_data(a integer, b integer)
LANGUAGE SQL
AS $$
INSERT INTO tbl VALUES (a);
INSERT INTO tbl VALUES (b);
$$;
CALL insert_data(1, 2);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
Run Code Online (Sandbox Code Playgroud)ERROR: syntax error at or near "PROCEDURE" LINE 1: CREATE PROCEDURE insert_data(a integer, b integer) ^ SQL state: 42601 Character: 8
我究竟做错了什么?
我在本地主机上运行数据库,以管理员用户身份运行。我自己安装的。安装过程无错误完成,我能够创建表、函数、触发器等。
postgresql ×10
performance ×3
amazon-rds ×1
aurora ×1
copy ×1
ddl ×1
errors ×1
jdbc ×1
json ×1
plpgsql ×1
transaction ×1