标签: sql-server-2017

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
查看次数

“PRIMARY”文件组已满。如何增加 SQL Server Express 2017 中的 temdb 大小?

当我重新索引特定表时

\n\n
DBCC DBREINDEX(@TableName, \'\',90) \n
Run Code Online (Sandbox Code Playgroud)\n\n

我收到一个错误

\n\n
\n

级别 17,状态 2,过程 aareindex,第 21 行 [批处理起始行 0]\n 无法为对象 \xe2\x80\x98dbo 分配空间。SORT 临时运行存储:\n 数据库 \xe2 中的 422738479742976\xe2\x80\x99 \x80\x98mydatabase\xe2\x80\x99 因为 \xe2\x80\x98PRIMARY\xe2\x80\x99\n 文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。

\n
\n\n

所以我想尝试增加 TempDb 的大小

\n\n

我可以通过查看数据库属性使用 SSMS 查看大小,但我不知道如何设置它。

\n\n

[更新]

\n\n
select type_desc, name, size, max_size, growth from tempdb.sys.database_files\n
Run Code Online (Sandbox Code Playgroud)\n\n

回报

\n\n

这些结果

\n\n

文件大小已为 10236 Mb,Express 限制为 10 Gig\n但是磁盘使用情况报告显示 26% 的磁盘空间未分配,40% 为数据,32% 为索引。

\n

sql-server sql-server-express sql-server-2017

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

如何检查数据库是否启用了 AUTO_CREATE_STATISTICS/AUTO_UPDATE_STATISTICS

我有一个项目数据库,它维护来自不同环境(开发、测试、生产、predprod...)的不同数据库,我需要检查是否AUTO_CREATE_STATISTICSAUTO_UPDATE_STATISTICSis设置为OFF/ON针对每个数据库以及是否将OFF其更改为ON.

ALTER DATABASE  DB
SET AUTO_CREATE_STATISTICS ON

ALTER DATABASE  DB
SET AUTO_UPDATE_STATISTICS ON
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

sql-server t-sql sql-server-2017

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

即使“执行后忽略结果”,什么也会导致 SELECT 语句执行延迟和高 ASYNC_NETWORK_IO

我们的 SQL Server 面临性能问题。

7 台服务器,都运行相同的应用程序,都存在相同的问题。

SELECT @@VERSION
Microsoft SQL Server 2017 (RTM-CU19) (KB4535007) - 14.0.3281.6 (X64)   Jan 23 2020 21:00:04   Copyright (C) 2017 Microsoft Corporation  Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor) 
Run Code Online (Sandbox Code Playgroud)

当您查看累积的服务器总等待统计信息时,会显示 99% ASYNC_NETWORK_IO。我们首先假设这是由应用程序引起的。然而:

当我们获取查询(从应用程序捕获)并从 SSMS 中将其作为测试运行时,执行后忽略结果。当我们通过 TCP 连接运行它时,大约需要 6 秒,通过命名管道连接运行它大约需要 50 秒。我们得到的结果非常慢。

(不考虑执行后的结果,查询给出的结果为 57k 行 227 列,大小为 221MB。)

它是核心版本,因此我们无法使用本地连接。我们测试了使用 TCP 和命名管道进行远程连接。

通过 TCP

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time …
Run Code Online (Sandbox Code Playgroud)

sql-server waits sql-server-2017 query-performance

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

fn_LocalTimeToUTC 的基本替代方案

我的云提供商阻止我访问fn_LocalTimeToUTCfn_UTCToLocalTime.

我将如何在不使用这些函数的情况下在 SQL 中手动和直接获得这两个函数提供的相同功能?

为了进一步简化,我们所有的用户都在英国。

sql-server t-sql functions sql-server-2017

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

两个备份程序,差异和注销同步

我正在 SQL Server 2017 上运行加密备份。

进行测试恢复,失败:

RESTORE DATABASE [test] 
FROM DISK = N'\\DPH-DD-SLI-001\SLI_SQL_Backups\Encrypted\DPH-SQL-SLI-12P\BTBLEAD\FULL\DPH-SQL-SLI-12P_BTBLEAD_FULL_20201021_185145.bak' 
WITH NORECOVERY, REPLACE; 

RESTORE DATABASE [test] 
FROM DISK = N'\\DPH-DD-SLI-001\SLI_SQL_Backups\Encrypted\DPH-SQL-SLI-12P\BTBLEAD\DIFF\DPH-SQL-SLI-12P_BTBLEAD_DIFF_20201022_071002.bak' 
WITH NORECOVERY; 
Run Code Online (Sandbox Code Playgroud)
Processed 199264 pages for database 'test', file 'BTBLEAD_Data' on file 1.
Processed 2 pages for database 'test', file 'BTBLEAD_Log' on file 1.
RESTORE DATABASE successfully processed 199266 pages in 446.348 seconds (3.487 MB/sec).
Msg 3136, Level 16, State 1, Line 6 This differential backup cannot be restored
because the database has not been restored to …
Run Code Online (Sandbox Code Playgroud)

sql-server backup sql-server-2017

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

SQL Server 是否支持来自多个连接的并行批量插入?

SQL Server 是否支持对同一数据库表的并行批量插入?

对我的特定用例的一些说明:

  • 该表有一个由两个不同索引键组成的聚集索引和两个非聚集索引,每个索引由一个索引键组成。
  • 并行在这里意味着来自多个不同的连接。每个连接都是一个唯一的sqlalchemy.orm.session对象,每个Session使用该Session.bulk_insert_mappings()方法同时插入20k条数据。

我的具体问题:

  • 我试图了解 SQL Server 端的幕后情况。是否有所有批量插入的队列,并且每个批量插入都按照进来的顺序一个一个地执行?还是所有的插入都是同时进行的,并行的?
  • 我们还假设没有两个不同的连接会尝试插入相同的记录(基于主键),但是如果两个并行连接尝试插入会导致 PK 违规的记录怎么办?
  • 如果我们要求 SQL Server 2008 与 2017,上述问题的答案是否不同?
  • Microsoft 是否有关于此的任何类型的文档?

sql-server-2008 sql-server concurrency bulk-insert sql-server-2017

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

为什么创建索引和运行查询比没有它运行查询更快?

我有几百万行的表。它包含来自外部服务的日志,所以我决定不对其进行索引(大量插入,稀疏读取)。

当我运行从没有索引的表中读取的查询时,它需要(不出所料)很长时间。

但是,当我创建索引并运行查询然后删除索引时,速度要快得多(即使创建和删除索引也是如此)。

为什么创建临时索引更快,而不是让 SQL Server 做它的事情?这似乎不直观(为什么 SQL Server 不自己创建索引?)。这种方法有什么缺点吗?


有问题的查询看起来像这样,但我认为它不一定相关,因为我在其他地方也看到了类似的行为。

    UPDATE Device
    SET Col1 = l.Col1
        ,Col2 = l.Col2
        ,Col3 = l.Col3
    FROM dbo.Device
        OUTER APPLY (
            SELECT MAX(Id) AS [Id]
            FROM dbo.Logs 
            WHERE Logs.Device_FK = Device.Id
            GROUP BY Logs.Device_FK
        ) lastLog
        OUTER APPLY (
            SELECT Col1, Col2, FORMAT(Col3) AS "Col3"
            FROM dbo.Logs
            WHERE Logs.Id = lastLog.Id
        ) l
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2017 query-performance

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

为什么新插入的行会出现在 SQL Server 分区表的两个文件组中?

我按年份对现有表进行了分区。为 2020 年的某个日期插入新记录后,新记录将显示为 2020 年分区主文件组的一部分。我很难确定这是否应该发生,或者我是否配置错误。

这是插入记录后分区的样子。在插入记录之前,此查询在主文件组中显示了 3 条记录,在 2021 组中显示了 3 条记录。

在此处输入图片说明

我期待 2020 分区中有一个新行,并且主文件组中的行数保持在 3,但也许这些是错误的期望。

主文件组是否总是显示分区的总数,或者行应该只显示在它们所属的分区中?

我可以展示我如何设置这一切,我很乐意,但这个问题更多的是关于结果应该是什么样子。我不希望多个分区中的同一行。

编辑

我刚刚找到了这个链接。这表明插入数据,其中新行的结果只有在正确的分区出现,而不是处于初级。所以看起来我做错了什么。

https://www.sqlshack.com/how-to-automate-table-partitioning-in-sql-server/

编辑 2

主要有所有 4 行的原因可能是它的上边界为空。由于主要已经存在于表中,因此从未修改过。也许我需要修改它?

编辑 3

有趣的是,此链接还显示了主分区中的分区总和。

https://www.mssqltips.com/sqlservertip/2888/how-to-partition-an-existing-sql-server-table/

SSMS 为分区生成的脚本

USE [Sandbox]
GO
BEGIN TRANSACTION
CREATE PARTITION FUNCTION [PunchPF1](datetimeoffset(7)) AS RANGE LEFT FOR VALUES (N'2020-01-01T00:00:00-05:00', N'2021-01-01T00:00:00-05:00', N'2022-01-01T00:00:00-05:00')
 
CREATE PARTITION SCHEME [PunchPS1] AS PARTITION [PunchPF1] TO ([Pre2020_Punch], [2020_Punch], [2021_Punch], [2022_Punch])
 
ALTER TABLE [time].[Punch] DROP CONSTRAINT [PK_Punch] WITH ( ONLINE = OFF …
Run Code Online (Sandbox Code Playgroud)

sql-server partitioning sql-server-2017

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

用于 NULL 值的存储空间

根据以下链接,NULL值占用一些存储空间:

/sf/ask/261182071/
https://www.sqlservercentral.com/forums/topic/null-storage-2

如果列具有固定宽度数据类型 -NULL占用列的长度

char(10) NULL takes 10 bytes
INT NULL takes 4 bytes
Run Code Online (Sandbox Code Playgroud)

如果列具有可变宽度 -NULL占用 0 字节

varchar(1000) NULL takes 0 bytes (+ 2 bytes of varchar column overhead ?)
Run Code Online (Sandbox Code Playgroud)

另外,拥有可为空的列也会产生开销。链接中的信息有点矛盾。
任何人都可以阐明这一点吗?

这是我的问题:

  1. 有人说可空列的开销是每行 1 位,有人说是每行 1 个字节,
    哪一个是正确的?我假设每行 1 位(因此 8 行构成 1 个字节),对吗?

  2. 对于 varchar 中的 NULL 值,每行仍然有 2 个字节的开销 - 这是真的吗?

  3. 最重要的问题:
    我有一个包含约 2.5 亿行数据的表,总大小约为 115 GB
    我使用下面的代码添加了 7 列,在每个命令后使用 sp_spaceused 检查表的大小

添加的列:

alter table MyTable add TestVarchar10 varchar(10) …
Run Code Online (Sandbox Code Playgroud)

null sql-server storage sql-server-2017

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