标签: postgresql

当我们在一个有大量数据的现有表中添加索引时会发生什么?

我有一个包含大约 1500 万条记录的表。现在我需要向表中添加一个索引。

添加索引需要一些时间来更新表中的每个条目。

我很困惑添加索引是否会导致停机。

如果是,那么我怎样才能克服停机时间?

postgresql index concurrency locking

11
推荐指数
1
解决办法
2375
查看次数

在 PostgreSQL 中检测 CREATE INDEX CONCURRENTLY 何时完成

如果我在 PostgreSQL 中同时创建了一个索引,我如何才能看到它何时完成?

我正在尝试重建索引以解决索引膨胀问题,我需要将旧索引保留一段时间直到新索引完成,所以我需要知道它何时完成。

这是 PostgreSQL 9.2/3ish

postgresql index concurrency

11
推荐指数
2
解决办法
5908
查看次数

PostgreSQL:将表作为函数中的参数传递

TYPE在 PostgreSQL 中发现。我有一个TABLE TYPE某些表必须尊重的(接口)。例如:

CREATE TYPE dataset AS(
    ChannelId INTEGER
   ,GranulityIdIn INTEGER
   ,GranulityId INTEGER
   ,TimeValue TIMESTAMP
   ,FloatValue FLOAT
   ,Status BIGINT
   ,QualityCodeId INTEGER
   ,DataArray FLOAT[]
   ,DataCount BIGINT
   ,Performance FLOAT
   ,StepCount INTEGER
   ,TableRegClass regclass
   ,Tags TEXT[]
   ,WeightedMean FLOAT
   ,MeanData FLOAT
   ,StdData FLOAT
   ,MinData FLOAT
   ,MaxData FLOAT
   ,MedianData FLOAT
   ,Percentiles FLOAT[]
);
Run Code Online (Sandbox Code Playgroud)

我可以使用此模板创建表:

CREATE TABLE test OF dataset;
Run Code Online (Sandbox Code Playgroud)

我在API 中看到了很多选项,但我有点迷茫。我想知道是否可以将此类型分配给函数INPUT/OUTPUT参数。

假设我有一个FUNCTION调用process,它从数据集中接收记录样本TABLE source,处理它们,然后返回TABLE sink具有相同TYPE.

那就是我想知道是否有可能创建一个TYPE …

postgresql datatypes functions

11
推荐指数
2
解决办法
4万
查看次数

如何在标准 SQL 或 T-SQL 中生成 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, ... 系列?

给定两个数字nand m,我想生成一系列的形式

1, 2, ..., (n-1), n, n, (n-1), ... 2, 1
Run Code Online (Sandbox Code Playgroud)

并重复它m几次。

例如,对于n = 3and m = 4,我想要以下 24 个数字的序列:

1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1
----------------  ----------------  ----------------  ----------------
Run Code Online (Sandbox Code Playgroud)

我知道如何通过以下两种方法之一在 PostgreSQL 中实现此结果:

使用以下查询,该查询使用该generate_series函数,以及一些确保订单正确的技巧:

WITH parameters (n, m) AS
(
    VALUES (3, 5)
)
SELECT 
    xi
FROM
(
    SELECT
        i, i …
Run Code Online (Sandbox Code Playgroud)

postgresql sql-server t-sql functions

11
推荐指数
4
解决办法
7402
查看次数

从 JSON 对象创建 UNIQUE 约束

让我们以表 peoples 为例,它只有 2 个字段:id 和 data(json)。

SELECT data FROM peoples ;
{"name": "Adam","pos":"DBA","age":22 }
{"name": "Alice","pos":"Security","age":33 }
{"name": "Bob","pos":"Manager","age":42 }
Run Code Online (Sandbox Code Playgroud)

我想为“pos”字段创建约束,它必须是唯一的。我在互联网上搜索了 JSON 约束,但没有结果。

我该如何处理这个问题?

postgresql json unique-constraint

11
推荐指数
1
解决办法
1万
查看次数

创建 PostgreSQL 约束以防止唯一组合行

想象一下你有一个简单的表:

name | is_active
----------------
A    | 0
A    | 0
B    | 0
C    | 1
...  | ...
Run Code Online (Sandbox Code Playgroud)

我需要创建一个特殊的唯一约束,该约束在以下情况下失败:相同is_active值不能共存不同的name值。

允许条件示例:

注意:简单的多列唯一索引不允许这样的组合。

A    | 0
A    | 0
B    | 0
Run Code Online (Sandbox Code Playgroud)

允许条件示例:

A    | 0
B    | 1
Run Code Online (Sandbox Code Playgroud)

失败条件示例:

A    | 0
A    | 1
-- should be prevented, because `A 0` exists
-- same name, but different `is_active`
Run Code Online (Sandbox Code Playgroud)

理想情况下,我需要唯一约束或唯一部分索引。触发器对我来说更成问题。

双重A,0允许,但(A,0) (A,1)不是。

postgresql exclusion-constraint

11
推荐指数
1
解决办法
2756
查看次数

如何在 PostgreSQL pgAdmin 4 中备份/恢复?

所以我觉得这应该是非常基本和容易做的事情,也许我只是没有正确地做事。

我想做相当于 SQL Server 备份的工作。我想创建一个完整的 .bak 文件并能够将数据库恢复到其原始状态。

到目前为止,我已经在 PgAdmin4 中尝试了许多不同的方法来从新创建的数据库创建备份文件。我迁移创建了一堆表的模式,然后对之前创建的文件执行还原。我期望恢复后我创建的所有表都消失了,我希望数据库处于我进行备份时的确切状态。

我尝试了许多不同的选项,例如包括在备份/恢复时保留/不保存数据的创建/删除数据库命令,但没有运气。

任何人都可以帮助我吗?

我正在使用命令pg_dump mydb -Fc > dbpg_restore db. 也许我缺少一些神奇的参数来完成我上面的要求?

试过了pg_restore --clean db,结果一样。

问题是我创建了我的数据库,里面什么都没有,备份它,创建一些表,恢复备份,我创建的表仍然存在。我想要一个恢复方法,使数据库处于与备份时相同的状态。

postgresql pgadmin restore

11
推荐指数
1
解决办法
5万
查看次数

如何检查我有权运行查询的数据库服务器上安装了什么数据库引擎?

我想检查我可以访问的 Datasase 服务器上正在运行什么类型的 sql。我只能访问 Web 界面和表格列表。

通过该界面,我可以对列表中的表运行查询。

如何获取有关服务器和服务器正在运行的版本的更多信息。我不知道服务器正在运行的 IP 或端口。

我想知道服务器是 MySQL、Mircosoft SQL Server、Oracle SQL、Postgre SQL 还是其他 sql server。

我正在谈论的网站是这个: w3schools.com SQL editor

编辑 2:虽然对于某些命令 select sqlite_version() 对我有用,但它不起作用。这是响应的屏幕截图。

在此处输入图片说明

编辑 3:在 Chromium 浏览器上,命令工作正常。但是在 Firefox 浏览器上,该命令不起作用。

我还提到我正在运行 Linux。

您认为在 Firefox 和 Chrome 上我得到不同结果的原因可能是什么?

mysql postgresql sqlite sql-server database-engine

11
推荐指数
4
解决办法
6290
查看次数

SQL Spec 是否需要在 EXISTS() 中使用 GROUP BY

Microsoft 当前允许使用此语法。

SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
  SELECT *
  FROM ( VALUES (1),(1) )
    AS t(x)
  WHERE g.x = t.x
  HAVING count(*) > 1
);
Run Code Online (Sandbox Code Playgroud)

请注意,没有GROUP BYEXISTS条款,是有效的ANSI SQL。或者它只是暴露了一个实现细节。

作为参考,PostgreSQL 中不允许使用相同的语法。

错误:列“tx”必须出现在 GROUP BY 子句中或用于聚合函数中

但是这种语法是允许的..

SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
  SELECT 1  -- This changed from the first query
  FROM ( VALUES (1),(1) )
    AS t(x)
  WHERE g.x = t.x
  HAVING count(*) …
Run Code Online (Sandbox Code Playgroud)

postgresql sql-server group-by sql-standard exists

11
推荐指数
1
解决办法
2438
查看次数

PostgreSQL 更新与删除 + 插入的“特别之处”是什么

我的理解是更新锁定一个元组,将其标记为已删除,然后添加一个新元组。

换句话说,更新 = 删除 + 插入。

或者我曾经相信。但在 MVCC 中,更新与删除 + 插入之间似乎存在一些根本不同。


设置:

CREATE TABLE example (a int PRIMARY KEY, b int);
INSERT INTO example VALUES (1, 1);
Run Code Online (Sandbox Code Playgroud)

方法一:更新

CREATE TABLE example (a int PRIMARY KEY, b int);
INSERT INTO example VALUES (1, 1);
Run Code Online (Sandbox Code Playgroud)

方法二:删除插入

-- session A                          session B
BEGIN;
UPDATE example SET b = 2 WHERE a = 1;
                                      DELETE FROM example WHERE a = 1;
COMMIT;
-- now there are 0 rows in table example (1 row was …
Run Code Online (Sandbox Code Playgroud)

postgresql concurrency mvcc

11
推荐指数
1
解决办法
1148
查看次数