AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-38619

s.m.'s questions

Martin Hope
s.m.
Asked: 2015-07-01 23:21:01 +0800 CST

Postgres 事务下的锁定问题

  • 2

我最近收到“共享内存不足 - 您可能需要增加 max_locks_per_transaction”错误。

这是一个长时间运行的过程,我在正确处理后导入一堆 CSV 文件。我遍历它们并为每个文件打开一个事务,处理它,然后当我完成文件时,关闭事务并移至下一个文件。

这些文件并不大,最大的大约 12K 行。

就 PG 而言,我所做的处理相当于做几个SELECTs(每行几个,没有连接或任何东西),然后是UPDATE一个现有行(每行最多一个)。

问题是,pg_locks填充了没有relation、类型transactionid和模式为 的事务ExclusiveLock。我有多达 20K 行这样的行pg_locks,除了那些,正如预期的那样,参考我正在使用的两个表,绝大多数看起来像这样(对不起,缩进会被搞砸,我正在发布一个指向 pastebin 的链接):

"locktype" "database" "relation" "page" "tuple" "virtualxid" "transactionid" "classid" "objid" "objsubid" "virtualtransaction" "pid" "mode" "granted" "fastpath"

"virtualxid" "" "" "" "" "11/18291" "" "" "" "" "11/18291" "6308" "ExclusiveLock" "t" "t"
"transactionid" "" "" "" "" "" "61840165" "" "" "" "11/18291" "6308" "ExclusiveLock" "t" "f"
"transactionid" "" "" "" "" "" "61843843" "" "" "" "11/18291" "6308" "ExclusiveLock" "t" "f"
"transactionid" "" "" "" "" "" "61833173" "" "" "" "11/18291" "6308" "ExclusiveLock" "t" "f"
"transactionid" "" "" "" "" "" "61835511" "" "" "" "11/18291" "6308" "ExclusiveLock" "t" "f"
"transactionid" "" "" "" "" "" "61846000" "" "" "" "11/18291" "6308" "ExclusiveLock" "t" "f"
"transactionid" "" "" "" "" "" "61838308" "" "" "" "11/18291" "6308" "ExclusiveLock" "t" "f"
"transactionid" "" "" "" "" "" "61832936" "" "" "" "11/18291" "6308" "ExclusiveLock" "t" "f"

http://pastebin.com/V4K3AvHD

基本上,这些记录都没有数据库或关系,只有事务 ID。

唯一不同的行是第一行,我认为它来自获取自身锁定的事务。

所有的锁都是由同一个连接获取的,显然只有在执行时才可以UPDATE,这实际上并不比

UPDATE t SET foo = COALESCE(foo, 0) + 23.4 WHERE bar = 'hey' and baz = 'ho'

并且最多可以影响一行。

当我处理完文件并提交事务时,所有这数千条记录都会从 中消失pg_locks,回到更正常的 15 到 30 条之间。就好像每条记录都UPDATE以某种方式获得了一个锁,使记录计数pg_locks增加每隔一两秒调一个。

我想我一定做错了什么,但我不知道是什么。

作为一种临时解决方法,我确实增加了 max_locks_per_transaction,但我真的很想真正解决这个问题。我认为我的用例不需要增加 max_locks_per_transaction,这很简单。

另外,请注意没有其他人正在访问我正在使用的两个表。甚至没有人访问同一模式中的任何表。

我在 Windows Web Server 2008 R2 上。

PostgreSQL 9.3.5,由 Visual C++ build 1600 编译,64 位

与 Npgsql 2.2.5 连接

任何人都可以解释一下吗?

我考虑过可能的索引问题,但是有问题的表无论如何都不大(少于 50K 行),并且SELECT使用与使用的相同标准对其进行UPDATE操作非常快。

提前致谢。

postgresql postgresql-9.3
  • 2 个回答
  • 2032 Views
Martin Hope
s.m.
Asked: 2015-04-23 05:39:26 +0800 CST

Postgres中数组列的内部连接

  • 7

在 Postgres 9.4中,我试图提取UNIQUEPostgres 中给定表的约束中涉及的所有列的名称。

看起来这些列的名称包含在pg_constraint. 根据文档,与我的问题相关的列被称为conkey,它恰好是一个ints 数组。

关键是,我提出的查询给了我错误的结果,我很确定这是因为我conkey以错误的方式加入。查询如下:

SELECT
    pg_attribute.attname,
    pg_constraint.*
FROM
    pg_attribute
INNER JOIN pg_constraint 
        ON pg_attribute.attnum = ANY (pg_constraint.conkey)
WHERE pg_constraint.conrelid = (
    SELECT
        oid
    FROM
        pg_class
    WHERE
        relname LIKE 'test_table'
)
AND pg_constraint.contype = 'u'; -- to filter out non-unique constraints

这是一个用于快速复制的表 DDL:

CREATE TABLE "test_table" (
"date" date DEFAULT now() NOT NULL,
"foo" varchar COLLATE "default" NOT NULL
CONSTRAINT "test_table_foo_key" UNIQUE ("foo")
)
WITH (OIDS=FALSE);

ALTER TABLE "test_table" OWNER TO "postgres";

现在,谁能告诉我我做错了什么?有没有更简单的方法来获得我想要的信息?

我正在尝试检索受约束表的名称,因为我正在编写的应用程序需要解决UPSERTPostgres 目前缺乏的问题。这个想法是使用 CTE 进行插入或更新,但由于我事先不知道受约束的列是什么,所以我需要做一些自省。

postgresql join
  • 1 个回答
  • 13019 Views
Martin Hope
s.m.
Asked: 2014-11-22 06:31:34 +0800 CST

关联关联表的ID

  • 2

对不起标题,我找不到更好的。欢迎提出建议。

假设我们有两个表,Suppliers并且Products. 相同的产品可能来自许多不同的供应商,因此我们SuppliersAndProducts使用此模式创建第三个表,我们称之为

SuppliersAndProducts

  - id (autoincrement)
  - supplier_id
  - product_id
  - from_date
  - to_date

from_并且to_date可以解释这样一个事实,即给定的供应商可能会停止销售给定的产品,但也可能在未来的某个时候再次开始销售。

现在,我们要存储Product从给定的购买 a 时支付的价格Supplier。当然,价格会随着时间而变化,我们也希望对其进行跟踪。

所以我们引入一个表,我们称之为SuppliersAndPrices,结构如下:

SuppliersAndPrices

  - id (autoincrement)
  - supplier_id (FK to the supplier id)
  - product_id (FK to the product id)
  - price
  - from_date
  - to_date

我关于最后一张表的问题比其他任何问题都更具概念性:这张表是否应该像我描述的那样(意味着关联基于供应商和产品 ID),或者只是引用SuppliersAndProducts我们可以调用的列的 ID suppliers_and_products_id?

后者的设计比前者更规范化;毕竟,aSupplier和 a之间的关联Product已经在 中说明SuppliersAndProducts,因此重复该信息没有什么意义。尽管如此,至少对我来说,出于某种原因,前者感觉更接近现实世界。

从查询复杂性的角度来看,要知道我今天为给定产品支付的价格,我必须编写第一个设计(使用一些伪 SQL 以保持与数据库无关),例如:

SELECT price 
FROM   SuppliersAndPrices 
WHERE  supplier_id = X 
       AND product_id = Y 
       AND today is between from_date and to_date

而第二种设计需要连接,因此查询看起来像:

SELECT price 
FROM   SuppliersAndPrices 
       INNER JOIN SuppliersAndProducts 
               ON SuppliersAndPrices.suppliers_and_products_id = SuppliersAndProducts.id 
WHERE  SuppliersAndProducts.supplier_id = X 
       AND SuppliersAndProducts.product_id = Y 
       AND today is between SuppliersAndPrices.from_date and SuppliersAndPrices.to_date

我正在写这篇文章,对我的 SQL 感到抱歉。

另外,现在我考虑了一下,对于第二种设计,我必须在WHERE条款中添加另一个条件来检查日期SuppliersAndProducts,以处理 aSupplier将停止携带产品并在某个时候开始销售的情况再次。在那种情况下,连接条件将返回多行,这将不是一件好事™。

那么,你会选择哪一个?以更规范化的名义关联已经是关联的 id,但以增加查询复杂性为代价?去规范化一点点以使查询更容易,并且可以说,数据库结构对于未来的维护者来说更清晰?

第二种设计的查询可能隐藏在视图后面,但那仍然是必须维护和理解的代码。对于“更好”的某些定义,我真正想知道的是两种设计中哪一种“更好”。

database-design database-agnostic
  • 2 个回答
  • 851 Views
Martin Hope
s.m.
Asked: 2014-05-20 08:07:58 +0800 CST

查找为给定连接执行的最后一条 SQL 语句

  • 0

MySQL 在 Windows 7 64 位上运行。

我正在尝试追踪连接泄漏,我很确定唯一使用服务器的 ASP.NET 应用程序在这里出现故障。

我们收到“连接过多”错误并检查服务器,我们看到许多连接状态为Sleep。

我知道,摆弄my.cf,MySQL 可以在较短的时间后被迫关闭睡眠连接,但我宁愿解决实际问题而不是症状。

所以我想知道是否有办法检索在给定连接上最后执行的 SQL 语句。我想如果我可以在较旧的睡眠连接上做到这一点,我可能会更容易追踪这个泄漏。

当然,如果有人能想到这种情况的替代解决方案,任何建议都是非常受欢迎的。

mysql-5.6 max-connections
  • 1 个回答
  • 2542 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve