标签: database-internals

SQL Server 在哪里存储 SA 密码和 SQL Server 密码策略?

在Linux上,SQL Server在哪里存储“SQL Server密码策略”和SA用户的密码?我明白了,“密码”不安全。

错误:无法设置系统管理员密码:密码验证失败。该密码不符合 SQL Server 密码策略要求,因为它太短。密码必须至少为 8 个字符..

进而,

错误:无法设置系统管理员密码:密码验证失败。该密码不符合 SQL Server 密码策略要求,因为它不够复杂。密码长度必须至少为 8 个字符,并包含以下四组中的三组字符:大写字母、小写字母、基数 10 的数字和符号。

我猜该策略实际上已编译到数据库中?密码会存储在一个不起眼的位置吗?

sql-server linux database-internals sql-server-2017

2
推荐指数
1
解决办法
8680
查看次数

物理读取和预读读取之间的区别

我试图理解read-ahead reading,但对我来说似乎有点复杂。我在网上搜索并得到以下信息:

阅读页面(微软文档):

预读预期完成查询执行计划所需的数据和索引页,并在查询实际使用这些页之前将它们放入缓冲区缓存。

从对为什么在 SQL Server 中首次执行查询时“物理读取”少于“预读”和“逻辑读取”的回答作者:huntharo 在 Stack Overflow 上:

物理读取 - 查询被阻塞,等待页面从磁盘读取到缓存中以供立即使用。

Read-Ahead Read - 页面在阻塞查询之前被读取,并像所有读取一样被读入缓存。当您扫描索引时,预读是可能的,在这种情况下,可以假定索引中的下一个叶页是需要的,并且可以在查询实际表示需要它们之前为它们启动读取。这允许磁盘在 db 引擎检查先前获取的页面的内容时忙碌。

也许有人可以使用他们自己的解释来澄清上述内容,因为我找不到预读的详细解释。

举个例子,看看statistics io信息:

Table 'TestLarge'. Scan count 1, logical reads 159185, physical reads 348, read-ahead reads 159209
Run Code Online (Sandbox Code Playgroud)

sql-server database-internals sql-server-2012 buffer-pool

2
推荐指数
1
解决办法
1084
查看次数

varchar(n) 大小?

varchar(5)当我在查询中使用时INSERT,这意味着表中的属性将在内存中占用5 个字节?(假设一个可打印字符占用一个字节)?

postgresql varchar storage memory database-internals

2
推荐指数
1
解决办法
6659
查看次数

差异备份失败并出现错误 3035,但日志备份成功

我们有一个 SQL Server 2014 Enterprise,其中 DIFF 备份失败。
这是我们收到的错误消息:

消息 3035,级别 16,状态 1,服务器 sqltest,第 1 行
无法对数据库“database1”执行差异备份,因为当前数据库备份不存在。通过重新发出 BACKUP DATABASE 来执行完整数据库备份,忽略WITH DIFFERENTIAL 选项。

分析以下查询的输出后,我们注意到第三方工具正在进行快照备份。

    select top 20 bs.type,bs.database_backup_lsn,bs.checkpoint_lsn,bs.backup_start_date,bs.is_snapshot,
    bs.is_copy_only,bs.user_name
    from dbo.backupset bs
    where bs.database_name = 'database1'
    order by backup_start_date desc
Run Code Online (Sandbox Code Playgroud)

根据Pinal Dave 的说法,这些工具使用 VSS 进行备份,这不是正常的完整备份。

我不明白的是为什么LOG备份会成功?据我所知,它们也是基于最后一次完整备份的。
有人可以向我解释这种差异吗?

sql-server backup database-internals

2
推荐指数
1
解决办法
303
查看次数

SQL Server 如何在内部检测记录?

我正在关注作者(堆栈程序员)指出的这篇SO post

SQL Server 使用标识列作为键值来引用特定行。因此只能创建一个标识列。

他还提到

此外,如果没有明确声明标识列,Sql server 内部会存储一个单独的列,其中包含每行的键值。

谁能更详细地解释这两点(特别是第二点)?

谢谢

sql-server database-internals

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

数据库原子操作实现

问题是关于未包含在“开始提交”块中的查询,而是关于 PostgreSQL、MySQL(至少是 innodb 引擎)中原子的普通插入和更新。那么这在内部是如何实现的呢?

transaction database-internals

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

从磁盘检索索引页后,数据库记录访问是否按顺序进行?

这个问题发布在 Stack Overflow 上,但没有得到解答,我希望也许在这里我能找到答案。

我对数据库的理解是,如果在磁盘页面中找到查询或请求的记录,则整个页面将加载到主内存中。

例如,如果表的内容存储在磁盘页面中,如下所示:

+-------+------------+----------+-----------+--------+
| rowid | EmployeeId | Lastname | Firstname | Salary |
+-------+------------+----------+-----------+--------+
|   001 |         10 | Smith    | Joe       |  40000 |
|   002 |         12 | Jones    | Mary      |  50000 |
|   003 |         11 | Johnson  | Cathy     |   4000 |
|   004 |         22 | Jones    | Bob       |  55000 |
+-------+------------+----------+-----------+--------+
Run Code Online (Sandbox Code Playgroud)

假设索引是在 上完成的EmployeeId

在主内存中加载页面后,如何搜索记录?(顺序或其他方法)

我想知道这是如何在 Oracle 以及其他一些(例如 Microsoft SQL Server)中执行的。

index database-internals

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

SQL Server 查询计划哈希冲突

我想知道是否有人可以阐明我的担忧,即query_plan_hash碰撞可能导致查询作为完全不同的查询执行。

散列是一个 16 位的十六进制,sp_help sys.dm_exec_query_stats表示是一个二进制。因此它只是一个 64 位的散列,并且碰撞似乎很有可能(考虑到 SHA1 [160 位] 刚刚被验证有碰撞)。

请问plan_hashquery_plan_hash都有碰撞的这个(查询作为一个完全不同的查询被执行)的情况发生?

我也很好奇 SQL Server 中是否有设置允许我们将此哈希更改为 SHA2-512(以减少发生冲突的可能性)。我们的数据非常重要。

我通过 Google 和 Stack Exchange 论坛进行了高低搜索。

sql-server execution-plan database-internals hashing

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

在哪里可以找到有关 SQL Server 内部结构的文档?

我知道,有人告诉我,微软在 MSDN 下有一个 per-dev doc 系统。具体来说,我正在寻找有关 WAL 日志内部格式的文档。这在任何地方都有记录吗?第三方肯定可以访问这个吗?

而且,无论如何,是否可以在不先付费的情况下知道 MSDN 记录的内容?

SQL Server 内部还有哪些其他文档来源?

sql-server database-internals

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

SQL Server 2017 中的范围分配机制

我正在查看页面和范围分配的 SQL Server 2017 文档。

我从在线资源和 SQL 会议的会议中了解到:从 SQL Server 2016 开始,统一范围分配是默认行为。但是,MS文档描述的是:

为了提高空间分配效率,SQL Server 不会将整个区分配给具有少量数据的表。

  • 统一范围由单个对象拥有;盘区中的所有八页只能由拥有对象使用。
  • 混合区最多由八个对象共享。范围中的八个页面中的每一个都可以由不同的对象拥有。

新表或索引通常从混合区分配页。当表或索引增长到它有八页时,它就会切换到使用统一区进行后续分配

所以,我的问题是:在 SQL Server 2016 及更高版本中,如果我们创建新表或索引,最初会分配统一范围还是混合范围?

sql-server documentation database-internals

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

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

我刚刚去了一些资源说:

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

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

sql-server data-pages database-internals

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

读取固定长度数据类型

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

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

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

这种开销是索引最适合固定长度列的原因吗?

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

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

sql-server database-internals

0
推荐指数
1
解决办法
272
查看次数