我曾经问过性能问题,人们会告诉我 PostgreSQL 自动将足够小的表完全保存在 RAM 中,以免给 HDD 带来压力,从而实现“小表”的超快读写,即很少更容易适合可用 RAM(或分配给 PG 的内容)的行。
这对我来说很有意义,让我很高兴,因为我可以在并行运行的脚本之间有效地进行通信,而不会给我可怜的 HDD/SSD 带来压力并堵塞所有资源。
但后来我突然想到:这怎么可能?PG 怎么可能将一个表全部保存在 RAM 中,无论它有多小,而不会丢失数据完整性?
如果它不是一直写入永久存储,如果突然断电,或者软件崩溃,或者在运行时发生其他一些灾难,它怎么可能恢复?我想得越多,这对我来说就越不重要。
我能想到的唯一答案是:不,它实际上并没有这样做。如果 PG 从不(或很少)将数据写入永久存储,我看不到任何可能的方式来避免丢失数据。
如果这是可能的,但只有在为表格或设置启用某种标志后,我才想知道该标志/设置。我想为仅包含“内部通信”数据的表启用此功能,该数据类型除了作为主动运行脚本的“公共数据存储”之外没有任何价值。
我知道这里(和这里)的其他答案说要订购newid()。但是,如果我top 1在子查询中进行选择- 以便在外部查询中的每行生成随机选择 - 每次使用都会newid()产生相同的结果。
那是:
select *,
(select top 1 [value] from lookupTable where [code] = 'TEST' order by newid())
from myTable
Run Code Online (Sandbox Code Playgroud)
...lookupTable.value在从 返回的每一行上产生相同的值myTable。
我正在尝试从lookupTable. 那个表只有几行。在现实世界中,我想要update myTable set someColumn = ......一个随机lookupTable.value值,这样每一行都myTable设置了一个随机值,而不是生成一个随机值并将其分配给所有行。
我的应用程序中有列的值始终为 4 位数字,例如“0100”或“1230”。示例之一可能是Merchant Category Code。
暂时,我已经将这个列的类型设置为char (4). 我有很多这种类型的专栏。这些类型的列之一也包含在非聚集UNIQUE索引中。我想为这种类型的专栏建立一种方法。
通过在应用程序中添加或 添加到开头来使用char (4)或可能更好吗?smallint' '0
包含这些列的表已分区,将包含大约 3 亿条记录。UPDATE可能不会在这种类型的列上执行。它们也不会出现在WHERE(有时可能出现在临时报告中)。
我应该选择哪种数据类型?
它就像一个邮政编码,它可以是数字,但你必须存储前导零
确切地。我在考虑在性能方面什么是更好的方法。还必须考虑到,如果我将其存储为smallint,应用程序代码必须将其解析为字符串并添加前导零。
当我省略该ORDER BY子句时,或者如果我将其作为选择运行并省略创建表部分,我有以下语句,但我需要这两者来确保生成的密钥排序正确
有任何想法吗?
消息 104381,级别 16,状态 1,第 18 行
ORDER BY 子句在视图、CREATE TABLE AS SELECT、INSERT SELECT、SELECT INTO、内联函数、派生表、子查询和公用表表达式中无效,除非 TOP 或 FOR XML 是还指定。
CREATE TABLE #demo
WITH (DISTRIBUTION = ROUND_ROBIN)
AS
SELECT
ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS ID,
schemas.name as [schema],
tables.name as [table],
columns.column_id as [ordinal],
columns.name as [column],
types.name as [type]
FROM SYS.COLUMNS
inner join sys.types
on types.system_type_id = columns.system_type_id
inner join sys.tables
on tables.object_id = columns.object_id
inner join sys.schemas
on schemas.schema_id = tables.schema_id
order by …Run Code Online (Sandbox Code Playgroud) 我是 PostgreSQL 的新手,所以如果我的问题听起来很愚蠢,请忽略。
想象一下,我们在 PostgreSQL 中有三个数据库,TRUNCATE一个小时前有人错误地在其中一个数据库上运行了一个命令。现在我们想单独为那个数据库做一个 PITR,因为只有一个数据库有问题。
在 PostgreSQL 中是否可以为一个特定的数据库执行 PITR 或者它只能在实例级别发生?
我阅读了持续存档和时间点恢复 (PITR)的文档。看起来它只能在实例级别完成(我猜我们在 PostgreSQL 世界中将实例称为“数据库集群”,我来自 SQL Server 世界)。
与普通文件系统备份技术一样,这种方法只能支持整个数据库集群的恢复,而不是一个子集。
如果 PITR 在 DB 级别是不可能的,那么 Prod DBA 如何处理这种情况?
还有最后一件事,我有一个带有多个数据库的测试服务器,如果 PITR 在数据库级别是可能的,那么请分享我的步骤,以便我可以自己测试它。
我主要对支持的 Postgres 版本感兴趣。我的测试服务器是 PostgreSQL 9.6.16。
是否有我可以运行的查询来显示所有带有标识列的表?试图找出是否有任何基于身份的表,其当前身份接近 int32 或 int64 的上限。
我在其中一个数据库上运行 DBCC CHECKDB 时遇到了分配错误。它抛出以下错误:
消息 8947,级别 16,状态 1,第 5 行表错误:对象 ID 1277199566、索引 ID 1、分区 ID 720577176766669456、分配单元 ID 720577087666647328 的多个 IAM 页(类型 LOB 数据)包含间隔。IAM 页面 (1:425664) 和 (1:1422669)。
CHECKDB 在表“schemaName.tableName”(对象 ID 1277199566)中发现 1 个分配错误和 0 个一致性错误。CHECKDB 在数据库“databaseName”中发现 1 个分配错误和 0 个一致性错误。
奇怪的是,当我尝试在该表上运行 DBCC CHECKTABLE 时,它没有显示任何错误。此外,我尝试运行 CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS 选项,但没有出现任何错误。
根据 Microsoft 文档:
要对数据库中的每个表执行 DBCC CHECKTABLE,请使用 DBCC CHECKDB。
对于指定的表,DBCC CHECKTABLE 检查以下内容:
- 索引、行内、LOB 和行溢出数据页正确链接。
- 索引按正确的排序顺序排列。
- 指针是一致的。
- 每页数据合理,包括计算列。
- 页面偏移是合理的。
- 基表中的每一行在每个非聚集索引中都有一个匹配的行,反之亦然。
- 分区表或索引中的每一行都在正确的分区中。
- 使用 FILESTREAM 在文件系统中存储 varbinary(max) 数据时文件系统和表之间的链接级一致性
但正如我所看到的,相反的情况并非如此。我们不能只对一张表运行 CHECKTABLE 并为同一张表获得相同的结果。
在检查特定对象的完整性和一致性方面,是否有人拥有与这两个命令之间的差异相关的信息?
我正在寻找一种可以生成创建 SQL 的方法,例如SQL选择约束时的 PgAdmin 选项卡。(pg admin 是怎么做的?)
我想实现一个通用方法,可以在处理后删除并重新创建外键约束。
来自文档:确定有效的数据库引擎权限
SQL Server 管理员可以查看有关所有登录名和用户的信息。权限较低的用户通常只能看到有关他们自己身份的信息。
根据上述引用,使用户成为SQL Server 管理员的权限是什么?
我是 SQL 执行计划的新手,我正在尝试了解更多有关它们的信息。
我有几个问题。
sql-server ×6
postgresql ×3
constraint ×1
datatypes ×1
dbcc-checkdb ×1
identity ×1
permissions ×1
plan-cache ×1
random ×1
restore ×1
scripting ×1
t-sql ×1