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
    • 最新
    • 标签
主页 / dba / 问题

问题[database-internals](dba)

Martin Hope
Joe
Asked: 2022-04-26 01:55:56 +0800 CST

使用表达式更改索引的定义而不删除/重新创建索引

  • 3

我处于一个特殊的情况:

我有多个索引以及使用函数的表达式。我想将它们切换到不同的函数,在那里我可以保证函数的行为相同(因此索引值不会无效)。理想情况下,我不想删除现有索引并重新索引它们,因为这需要更多的开发开销。

我可以在pg_index表格中看到,有一个indexprs列,其中包含索引的“内部”定义(该pg_indexes表格是这个的漂亮打印版本)。具体来说,我认为我确定了相关索引的格式类似于({FUNCEXPR :funcid 870 :funcresulttype 25 :funcretset false......

将其回溯funcid 870到 中information_schema.routines,我能够将其与specific_name(包含此 funcid)相关联,并且能够确定它确实是我想要更改的特定功能。

理论上是否可以用新的funcid替换这个funcid,然后索引将引用新的函数?我该怎么做,因为这个列是 pg_node_tree 类型的?如果没有,有没有办法以一种非hacky的方式实现我的目标?

附录:除非有一种被证明是安全的方法,否则我可能仍然会以“干净”的方式来做这件事,但这激起了我的兴趣,足以提出一个问题。

postgresql database-internals
  • 1 个回答
  • 78 Views
Martin Hope
xhr489
Asked: 2021-10-04 13:25:23 +0800 CST

读取固定长度数据类型

  • 0

假设我有一个固定长度的列,我SELECT从它开始,比如 100 行。在读取固定长度列的不同行时,SQL Server 是检查每一行的列长度还是检查一次并重用此信息以便可以更快地读取后续行?

相反,对于可变长度列,SQL Server 需要使用偏移数组检查每一行的每个可变长度列的长度。

所以我的问题是:SQL Server 是否检查每一行的固定长度数据类型的长度(即在行的状态位 A 和 B 部分之后)?从逻辑上讲,当它需要读取一个固定长度的列时,它只需要检查一次。

这是为什么索引最适合固定长度列的原因吗?

不试图解决任何问题,只是试图理解。

额外信息:关于固定长度列上的索引最好:当我阅读这篇文章SQL Server 性能的索引策略时,这整个问题就开始了。有一次它说:“聚集索引键应该很窄,但也应该使用固定宽度的数据类型。” 这种说法的原因是什么?我只能想到与我的问题有关的原因,即固定长度的列更便宜,因为长度只需要检查一次。

sql-server database-internals
  • 1 个回答
  • 144 Views
Martin Hope
Mike S
Asked: 2021-09-29 12:02:43 +0800 CST

为什么 SQL Server 跟踪标志 715 的行为与 TABLOCK 查询提示不同?

  • 2

这是我的理解,基于众多来源(包括这个来源:https ://techcommunity.microsoft.com/t5/sql-server/migrating-sap-workloads-to-sql-server-just-got-2-5x-faster /ba-p/384910 ) SQL Server 跟踪标志 715 应该等同于 TABLOCK 查询提示——不同之处在于 TF715 可以在会话和全局级别设置,而 TABLOCK 只能用作查询提示。

我的问题是,我在 SQL Servers 2016 和 2019 开发版上都以简单的恢复模型进行了测试,无论我使用哪种服务器,TABLOCK 和 TF715 都得到了不同的结果。TABLOCK 按预期工作,而 TF715 没有。具体来说,TABLOCK 告诉 SQL Server 为批量操作取出整个表锁,并最少记录操作。

考虑以下代码。这会将 10,000 行插入到堆中。

DROP TABLE IF EXISTS Test
GO

CREATE TABLE Test (t VARCHAR(100))
GO

INSERT INTO Test (t)
SELECT TOP (10000)
    x = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
FROM       sys.columns AS s1
CROSS JOIN sys.columns AS s2

现在,如果您运行下一个代码块,您可以看到它记录了 10,000 行。

SELECT 
    [Fully Logged Rows] = COUNT_BIG(*) 
FROM sys.fn_dblog(NULL, NULL) AS FD
WHERE
    FD.Operation = N'LOP_INSERT_ROWS'
    AND FD.Context = N'LCX_HEAP'
    AND FD.AllocUnitName = N'dbo.Test';

好的,所以现在如果我们使用 TABLOCK 提示重新执行此操作,您可以看到它变成了最小记录操作(即,完全记录的行数 = 0)。

DROP TABLE IF EXISTS Test
GO

CREATE TABLE Test (t VARCHAR(100))
GO

INSERT INTO Test WITH (TABLOCK) (t)
SELECT TOP (10000)
    x = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
FROM       sys.columns AS s1
CROSS JOIN sys.columns AS s2
--0 Fully Logged Rows
SELECT 
    [Fully Logged Rows] = COUNT_BIG(*) 
FROM sys.fn_dblog(NULL, NULL) AS FD
WHERE
    FD.Operation = N'LOP_INSERT_ROWS'
    AND FD.Context = N'LCX_HEAP'
    AND FD.AllocUnitName = N'dbo.Test';

但是,当我尝试启用 TF715(并取消 TABLOCK 提示)时,我仍然会得到 10,000 行完全记录的行,而我希望进行最少记录的操作。

--Enable TF715 on both a session and global level to cover all bases...
DBCC TRACEON(715)
GO
DBCC TRACEON(715, -1)
GO
DBCC TRACESTATUS
GO

DROP TABLE IF EXISTS Test
GO

CREATE TABLE Test (t VARCHAR(100))
GO

INSERT INTO Test (t)
SELECT TOP (10000)
    x = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
FROM       sys.columns AS s1
CROSS JOIN sys.columns AS s2

--10000 Fully Logged Rows
SELECT 
    [Fully Logged Rows] = COUNT_BIG(*) 
FROM sys.fn_dblog(NULL, NULL) AS FD
WHERE
    FD.Operation = N'LOP_INSERT_ROWS'
    AND FD.Context = N'LCX_HEAP'
    AND FD.AllocUnitName = N'dbo.Test';

DBCC TRACEOFF(715)
GO
DBCC TRACEOFF(715, -1)
GO
DBCC TRACESTATUS
GO

我在看什么?我不需要重新启动 SQL Server 来通过 DBCC 启用 TF,对吗?

先感谢您。

sql-server database-internals
  • 1 个回答
  • 89 Views
Martin Hope
sev
Asked: 2021-06-16 03:01:02 +0800 CST

对 postgres 中几乎无间隙序列的建议

  • 4

由于这篇文章https://stackoverflow.com/questions/9984196/postgresql-gapless-sequences中提到的原因,在 PostgreSQL 中序列被设计为有间隙。我的问题是:不能通过定期(比如说每天一次)检查哪些序列号未使用并将它们添加回序列中来使序列几乎没有间隙吗?

我假设当前 postgres 将一个序列实现为一个计数器,每次访问它时它都会递增。相反,它可以用一个自由值列表和一个计数器来实现。然后该序列将按如下方式工作:

# python style pseudo code

class Sequence:
    def __init__(self):
        self.free_numbers_set = []
        self.counter = 0

    def get_next_sequence_value(self):
        if not isempty(self.free_numbers_set):
            id = self.free_numbers_set.pop(0)
        else:
            id = self.counter
            id ++

        return id

    def add_free_numbers(self, column):
        for i in range(0:self.counter):
            if not i in column:
                free_numbers_set.append(i)
        free_numbers_set.sort()

每次我们需要一个新的 id 时,我们都会运行get_next_sequence_value()并定期运行add_free_numbers(column)

更新解决了一些问题

  1. 对于标识列,获取当前使用的值将是微不足道的。在其他情况下,由用户提供已在使用的值列表。
  2. 需要考虑与 MVCC 的交互。可以潜在地实现它,以便在缺失值更新期间,序列将默认为仅递增计数器 - 这将避免冲突。

我相信这个解决方案可以提供更少的稀疏序列,这将允许用户使用更小的 id 类型(int vs bigint),同时向后兼容当前的实现。

postgresql database-internals
  • 1 个回答
  • 295 Views
Martin Hope
Govinda Sakhare
Asked: 2021-06-07 07:15:28 +0800 CST

跟踪 Postgres 前端和后端消息

  • 1

根据我的理解,当我们执行命令或查询时,Postgres 客户端会发送一条前端消息,然后以后端消息格式获取响应。

如何在 Linux 机器上捕获和检查这些消息?

例如,假设我正在通过psql客户端执行以下命令

 psql --username=foo --dbname=mydb --password=foobar

我相信客户会创建StartupMessage。

有没有办法追踪这种互动?考虑到服务器和客户端在同一台机器上运行。

postgresql database-internals
  • 2 个回答
  • 138 Views
Martin Hope
Paul White
Asked: 2020-08-30 06:55:14 +0800 CST

防止由于空闲工作线程修剪而导致 THREADPOOL 等待

  • 12

在阅读了 Josh Darnell 的Unusual THREADPOOL Waits之后,一位 Twitter 用户提到有一个未记录的跟踪标志来防止修剪空闲的工作人员:

鸣叫

这个想法是,一旦 SQL Server 创建了足够的线程来为峰值工作负载提供服务,它不应该在 15 分钟左右不需要它们之后修剪工作线程(将它们释放到操作系统)。

空闲的工作线程将继续使用资源(例如内存),THREADPOOL但当突然需要更多工作人员时不会出现等待的爆发。显然,这在使用 Always On 可用性组时会有所帮助。

这个未记录的跟踪标志是什么,它是如何工作的?

sql-server database-internals
  • 1 个回答
  • 536 Views
Martin Hope
Great Greek
Asked: 2020-08-12 09:33:40 +0800 CST

varchar(40) 列存储“abcd”与字符集“ucs2”和“utf8mb4”的存储空间要求?

  • 1

我知道如果长度> 255,则需要 2 个字节来存储长度前缀。我只需要验证我的假设。请告诉我字符集(latin1,ucs2,utf8mb4)的长度前缀和字符串('abcd')的长度。对于 varchar(20) 列。文件说:

[...]对于字符串“abcd”,L 为 4,存储要求为 5 个字节。如果同一列改为使用 ucs2 双字节字符集,则存储要求为10 个字节:'abcd' 的长度为 8 个字节,该列需要两个字节来存储长度,因为最大长度大于 255 (最多 510 个字节)。[...]

参考: 11.7 数据类型存储要求(Oracle | Docs)

我只是不明白为什么对于带有字符集'ucs2'的'abcd',即使它小于255,它也需要2字节长度的前缀。

mysql database-internals
  • 1 个回答
  • 108 Views
Martin Hope
abhishek
Asked: 2020-06-03 03:27:45 +0800 CST

数据库文件存储结构中的统一范围和混合范围有什么区别?

  • 1

我只是去了一些资源说:

统一范围由单个对象拥有,混合范围最多可以由 8 个对象共享。

但是我无法理解他们的洞察力,比如这种结构有什么好处?基本上,我是这个领域的新手,所以如果你能提供一些直观的例子和应用程序,将不胜感激。

sql-server database-internals
  • 1 个回答
  • 281 Views
Martin Hope
Hannah Vernon
Asked: 2019-07-23 11:52:10 +0800 CST

“无效的保护选项”

  • 7

在以下错误消息中,给出的原因是“无效的保护选项”。这说明什么?

SQL Server 检测到基于逻辑一致性的 I/O 错误:无效的保护选项

出于这个问题的目的,我不需要知道任何关于“如何运行 DBCC”或“检查损坏”的信息。收到。我只是对“根本原因”部分以及可能导致这种基于逻辑一致性的 I/O 错误的原因感到好奇。

sql-server database-internals
  • 1 个回答
  • 487 Views
Martin Hope
Kimo
Asked: 2019-02-01 05:45:01 +0800 CST

为什么索引重建需要 Sch-M 锁?

  • 4

我不明白为什么索引重建需要给定索引上的 Sch-M 锁。

sql-server database-internals
  • 2 个回答
  • 1425 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