Questions tagged «postgresql»

PostgreSQL的所有版本。如果该上下文很重要,请添加其他特定于版本的标记,例如postgresql-11。

2
选择最长的连续序列
我正在尝试在PostgreSQL 9.0中构造一个查询,以获取特定列的最长连续行序列。 请考虑下表: lap_id (serial), lap_no (int), car_type (enum), race_id (int FK) lap_no每个地方都是独特的(race_id, car_type)。 我希望查询为给定的race_id和生成最长的序列car_type,因此它将返回int最高的(或长)。 带有以下数据: 1, 1, red, 1 2, 2, red, 1 3, 3, red, 1 4, 4, red, 1 5, 1, blue, 1 6, 5, red, 1 7, 2, blue, 1 8, 1, green, 1 对于car_type = …

3
区域名称PostgreSQL错误的“ AT TIME ZONE”?
我在回答这个stackoverflow问题,发现奇怪的结果: select * from pg_timezone_names where name = 'Europe/Berlin' ; name | abbrev | utc_offset | is_dst ---------------+--------+------------+-------- Europe/Berlin | CET | 01:00:00 | f 和下一个查询 select id, timestampwithtimezone, timestampwithtimezone at time zone 'Europe/Berlin' as berlin, timestampwithtimezone at time zone 'CET' as cet from data ; id | timestampwithtimezone | …

3
PostgreSQL初始数据库大小
我的问题分为两部分。 有没有一种方法可以在PostgreSQL中指定数据库的初始大小? 如果没有,当数据库随着时间增长时如何处理碎片? 我最近从MSSQL迁移到Postgres,在创建数据库时我们在MSSQL世界中所做的一件事是指定数据库和事务日志的初始大小。这样可以减少碎片并提高性能,尤其是如果事先知道数据库的“正常”大小时。 数据库的性能随着大小的增长而下降。例如,我要处理的工作量通常需要10分钟。随着数据库的增长,这个时间增加了。进行VACUUM,VACUUM FULL和VACUUM FULL ANALYZE似乎无法解决问题。解决性能问题的方法是停止数据库,对驱动器进行碎片整理,然后进行VACUUM FULL ANALYZE,将测试的性能恢复到最初的10分钟。这使我怀疑碎片化是导致我疼痛的原因。 我在Postgres中找不到任何有关保留表空间/数据库空间的引用。我使用的术语错误,因此一无所获,或者在Postgres中有另一种缓解文件系统碎片的方法。 有指针吗? 解决方案 提供的答案有助于确认我开始怀疑的地方。PostgreSQL将数据库存储在多个文件中,这使数据库可以增长而无需担心碎片。默认行为是将这些文件与表数据一起打包到边缘,这对很少更改的表有好处,但对经常更新的表不利。 PostgreSQL利用MVCC提供对表数据的并发访问。在此方案下,每次更新都会创建已更新行的新版本(可以通过时间戳或版本号,谁知道呢?)。旧数据不会立即删除,但会标记为删除。实际删除发生在执行VACUUM操作时。 这与填充因子有何关系?表格默认填充因子100完全填满了表格页面,这又意味着表格页面中没有空间来容纳更新的行,即,更新的行将与原始行放置在不同的表格页面中。如我的经验所示,这对性能不利。由于汇总表的更新非常频繁(最高1500行/秒),因此我选择将填充因子设置为20,即表的20%用于插入的行数据,而80%用于更新数据。尽管这看起来可能过多,但为更新的行保留的大量空间意味着更新的行与原始行位于同一页面内,并且在自动清理守护程序运行以删除过时的行时,表页面未满。 为了“修复”我的数据库,我做了以下工作。 将摘要表的填充因子设置为20。您可以在创建时通过将参数传递给CREATE TABLE或在事后通过ALTER TABLE来实现。我发出了以下plpgsql命令:ALTER TABLE "my_summary_table" SET (fillfactor = 20); 发出VACUUM FULL,因为这将写入表文件的全新版本,因此,暗含了使用新的填充因子写入新的表文件的情况。 重新运行测试,即使数据库足够大以容纳数百万行,我也看不到性能下降。 TL; DR-不是文件碎片造成的,而是表空间碎片造成的。通过调整表格的填充因子以适合您的特定用例,可以缓解这种情况。

2
删除数据库后释放磁盘空间
我正在开发一个dev系统,并且一直在还原到我用于开发目的的数据库“ foo”。在处理这些问题时,我刚刚运行了DROP DATABASE foo。但是,我很快意识到我已经吃光了磁盘上的所有空间。废话 VACUUM FULL是否从另一个逻辑数据库中释放了我先前删除的数据库(foo)的空间?我从另一个逻辑数据库中尝试了此操作,并回收了可用空间,但我认为这不足以解决我进行的所有CREATE DATABASE / DROP DATABASE调用。它可能只是对我运行的逻辑数据库进行了真空处理。 必须有一种无需执行整个数据库初始化就可以回收该空间的方法吗? 编辑 因此,我大致按照以下步骤从备份重新初始化了数据库。还原后,我已经收回了磁盘上的大量空间!现在可以使用,但是有关如何清除删除的数据库的任何帮助仍然有用。 编辑2 因此,我设法收集了有关此问题的更多信息...这是我想出的一个示例: Initial partition size: Size Used Avail Use% Mounted on 25G 8.1G 16G 35% /apps1 After creating my new database and populating it: 25G 18G 6.4G 73% /apps1 After Dropping the database using "DROP database mydb" …

1
在JDBC中禁用显式提交,在SQL中检测它们,或将数据库置于只读状态
背景:我正在http://sqlfiddle.com(我的网站)上工作,并试图防止可能的一种滥用途径。我希望通过询问我当前要解决的问题,我不会无意间使潜在的虐待更为严重,但是您能做什么?我相信你们。 我想防止任何用户在给定的交易块内发出明确的“提交”调用。从SQL Fiddle的上下文来看,事务块是在右侧面板上执行的代码。基本上,我遍历并执行一系列明文SQL命令,并且我想确保它们所做的所有更改都将在批处理结束时回滚。通常,它们的更改会回滚,但是有时文本中会包含明确的“ commit”语句,因此我的回滚当然是行不通的。用户试图破坏SQL Fiddle上的架构时,很可能发生这种显式提交,因此其他从事此操作的人将看到错误。 主要期望结果:如果可能,我想在JDBC级别禁用显式提交。这是因为我必须支持多个数据库后端供应商,并且当然每个供应商都有其低级的怪癖。 Fallback选项:如果无法将JDBC配置为禁用显式提交,那么我将接受在处理以下每个后端批处理时检测显式提交的解决方案:SQL Server,Oracle,MySQL和PostgreSQL。 对于SQL Server,我想到了这种解决方案:在执行该语句之前,先解析XML查询计划中的语句,然后检查是否存在与该XPath相匹配的条目: //*[@StatementType="COMMIT TRANSACTION"] 我认为这对于SQL Server来说会很好。但是,这种方法不适用于其他数据库类型。Oracle针对显式提交的XML执行计划输出未引用您正在运行commit语句的事实(而只是重复从其提交的查询中重复执行计划输出)。PostgreSQL和MySQL根本不为显式提交提供任何执行计划输出(XML或其他方式)。 剩下的工作就是检查“ commit”一词的实际陈述。这将起作用,除非可能存在各种变化: declare @sql varchar(50) set @sql = 'com' + 'mit' exec(@sql); 上面是SQL Server的示例(我可以解决),但是我想Oracle,MySQL和PostgreSQL可能会发生类似的事情。我在这个假设上错了吗?也许他们不允许“动态”提交语句?随意使用SQL Fiddle(最好不要使用示例架构或可能正在使用的其他示例)来查看是否可以在Oracle,MySQL和PostgreSQL中进行类似的操作。如果没有,也许简单的字符串检测可能适用于那些。 还有另一种可能性 我想到了另一个选择-如果您知道一种将这些数据库中的任何一个设置为只读模式的方法,例如在该模式下,什么也不能提交,那也可以工作。只要在该模式下什么也不能提交,我就仍然需要允许启动事务并在其中运行代码。那可能吗? 更新资料 我最近学到的-PostgreSQL实际上不是问题。显然,如果同一交易块最终被回滚(在Postgres中),则该交易块中发出的提交将不适用。所以为Postgres致敬! 多亏了Phil在SO帖子上的链接,我想我可以使用DEFERRABLE INITIALIALLY DEFERRED hack for Oracle来完成我要执行的操作(如果发出了提交,将会引发错误,但是我可以解决这个问题)。这应该针对Oracle。(我想了一会儿嵌套事务可能在这里工作,但是Oracle似乎不支持嵌套事务?无论如何,我找不到以这种方式工作的任何东西)。 真的还没有针对MySQL的解决方案。使用嵌套事务进行了尝试,但这似乎不起作用。我正在认真考虑MySQL的更严格的方法,例如不允许在右侧使用SELECT或在每次查询后删除/重新创建数据库。听起来都不好。 解析度 因此,我现在已经为SQL Server和Oracle实现了所描述的解决方案,并且正如我提到的那样,对于PostgreSQL来说这实际上不是问题。对于MySQL,我采取了一些不幸的步骤,将查询面板限制为仅选择语句。仅需在架构面板(左侧)上输入用于MySQL的DDL和DML。我希望这不会破坏太多的旧提琴,但是我认为这只是确保数据一致性所要做的。谢谢!

1
PostgreSQL数据库数据文件完整性检查
在运行PostgreSQL数据库系统时,我如何知道我的数据库整体上具有100%的完整性?基本上,我如何知道我的数据文件和页面是否全部100%良好且没有损坏? 在Microsoft SQL Server世界中,有一个命令可以执行DBCC CHECKDB,该命令将告诉您是否存在问题。如果您打算进一步了解该命令,则这里是一个链接。DBCC CHECKDB(Transact-SQL) 我是一个偏执狂的数据库完整性专家(任何以DBA类型角色使用数据库的人都应该这样),这种类型的事情使我很难在晚上睡个好觉。像这样的实用程序是必须的!在Google上进行的搜索已经找到了一些类似工具的尝试,我认为除非它是PostgreSQL项目正式接受的工具,否则我不会因为它的重要性而相信它。 这里有一些链接,人们在问类似的问题时,我认为没有真正的答案。在我看来,PostgreSQL需要拥有一些Oracle和Microsoft SQL Server似乎具备的工具。 第一个链接是我在该主题上找到的最有趣的链接。我认为对这篇文章的评论可能是这样总结的:“ Postgres在识别数据库损坏并修复它时非常la脚。检测到它的唯一方法是通过转储数据库或从数据库的每个表中选择* 。” PostgreSQL如何防止部分页面写入和数据损坏 检查数据和索引文件损坏-Dev Shed 帮助:我的桌子坏了! PostgreSQL:主键损坏,表不一致 我相信9.3有可能具有某些损坏检查功能。如果选择的话,似乎希望对页面文件进行汇总检查。因此,如果您考虑使用ZFS和/或带有页面检查求和的Postgres的将来版本,那么情况看起来就很好。 https://commitfest.postgresql.org/action/patch_view?id=759 更新:2012年1月14日-好像使用基于ZFS的文件系统一样,可以通过检查每个数据块的总和来检测损坏。我将不得不对此进行进一步的研究,看看是否可以通过一种解决方法,让一个晚上知道他们的数据库数据没有被无提示地破坏,从而使其睡个好觉。 更新:2012年1月17日-如何使用ZFS查找损坏的文件。http://docs.oracle.com/cd/E18752_01/html/819-5461/gbbwl.html#gbcuz 更新:2014年4月14日9.3确实获得了数据校验和。https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.3

4
无NULL,但编码“ UTF8”的字节序列无效:0x00
我花了最后8个小时尝试将mysqldump --compatible = postgresql的输出导入到PostgreSQL 8.4.9中,并且在这里和其他地方已经阅读了至少20个不同的线程,但是都没有找到关于此特定问题的信息。实际可行的答案。 MySQL 5.1.52数据转储: mysqldump -u root -p --compatible=postgresql --no-create-info --no-create-db --default-character-set=utf8 --skip-lock-tables rt3 > foo PostgreSQL 8.4.9服务器作为目标 使用'psql -U rt_user -f foo'加载数据正在报告(其中很多,这是一个示例): psql:foo:29: ERROR: invalid byte sequence for encoding "UTF8": 0x00 HINT: This error can also happen if the byte sequence does not match the encoding …

3
SQL将XML从文件读入PostgreSQL数据库
如何编写SQL将XML文件读入PostgreSQL XML值? PostgreSQL具有本机XML数据类型,该XMLPARSE函数具有将文本字符串解析为该类型的功能。它还具有从文件系统读取数据的方法。在COPY声明中,等等。 但是我看不到编写本机PostgreSQL SQL语句以从文件系统条目中读取内容并使用其填充XML值的方法。我怎样才能做到这一点?
12 postgresql  xml 


1
PostgreSQL:TRUNCATE后未释放磁盘空间
我有TRUNCATE一个巨大的表(〜120Gb),名为files: TRUNCATE files; VACUUM FULL files; 表大小为0,但没有释放磁盘空间。有什么想法如何找回丢失的磁盘空间吗? 更新: 大约12个小时后释放了磁盘空间,我这边没有采取任何措施。我使用Ubuntu 8.04服务器。


2
Postgresql 8.3:限制每个查询的资源消耗
我正在使用PostgreSQL 8.3 + PostGIS 1.3在Ubuntu 8.04 Hardy上存储地理空间数据。 当buffer()在非常复杂的段上计算时,此特定版本的PostGIS存在一个错误,这会导致查询占用越来越多的内存,直到整个计算机陷入困境。 我正在寻找一种可以实现以下目的的PostgreSQL机制: 限制特定查询使用的内存消耗(可能还有其他资源)。 自动停止执行时间超过特定阈值的查询。 有任何想法吗?

3
如何实现具有最大属性数量未知的实体?
我正在设计一个棒球模拟程序,但是在设计boxscore模式时遇到了问题。我的问题是我想跟踪每个局得分多少次。我在实际程序中执行此操作的方法是使用一个动态数组,该数组随所播放的每个局而增长。 对于那些不熟悉棒球比赛的人,通常比赛会长9局,除非比赛在第9局结束时并列。因此,棒球比赛的长度没有确定,这意味着我不能设计数据库仅将9列记录为每一局的得分(技术上来说是18列(9局* 2队)。我不得不想到的是序列化数组并在将其存储到数据库之前将其编码为Base64,但是,我不知道这是否是一种很好的技术,我想知道是否有人有更好的主意。 万一重要,我正在开发的数据库是PostgreSQL。 任何建议,不胜感激!谢谢!

4
是否真的有可能无法保证针对此特定的冗余派生表的顺序?
在与Lukas Eder的Twitter交谈中,我偶然发现了这个问题。 尽管正确的行为是将ORDER BY子句应用于最外层查询,因为在这里,我们没有在最外层查询中使用DISTINCT,GROUP BY,JOIN或任何其他WHERE子句,因此RDBMS为什么不通过传入的数据是否由内部查询排序? SELECT * FROM ( SELECT * FROM table ORDER BY time DESC ) AS t 至少在PostgreSQL上运行此示例时,对于内部查询和此派生表示例,您将获得相同的执行计划,以及相同的结果集。 因此,我认为规划器将只丢弃最外面的查询,因为它是多余的,或者只是传递内部表的结果。 有人认为情况可能并非如此吗?

1
如何移动PostgreSQL表空间?
有没有一种方法,以物理移动的PostgreSQL 9.3表/old/dir来/new/dir?我只想mv目录,然后告诉PostgreSQL表空间现在位于/new/dir。看起来ALTER TABLESPACE只能让您重命名。 我想避免创建新的表空间并将数据库移到其中。我认为这将是一个缓慢的复制过程,需要大量时间和磁盘空间。我也想避免链接/old/dir到/new/dir。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.