标签: sql-server

确定是否在不登录的情况下启用混合模式身份验证?

在 SQL Server 中是否可以在不登录 SQL Server 的情况下确定是否启用了混合模式身份验证?

authentication security sql-server sql-server-2012 logins

12
推荐指数
2
解决办法
1551
查看次数

统计数据:CPU 时间 vs 已用时间。什么更重要?

在性能调优时,更重要的是:

  • CPU时间或经过的时间?
  • 是否存在其中一个比另一个更重要的场景?

一个例子:虽然性能调整 CPU 时间将减少~38%,但 Elapsed Time增加~22%。这是一种改进吗?

performance sql-server performance-tuning

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

为 BULK INSERT 配置无约束委派

我在 Always On 可用性组中有一对 Microsoft SQL Server 2016 节点。我正在尝试对BULK INSERT位于 Windows Server 2016 文件服务器故障转移群集上的文件执行(使用 SQL Server 2016 Management Studio 查询),但出现以下错误:

消息 4861,级别 16,状态 1
无法批量加载,因为无法打开文件“\nas2.my.domain\Microsoft SQL Server 2016 Enterprise\test.txt”。操作系统错误代码 5(访问被拒绝。)。

无论我使用活动节点名称 ( nas2.my.domain) 还是故障转移群集侦听器 ( nas.my.domain),都会发生这种情况。

环顾四周后,我发现这是由于 SQL Server 由于与BULK INSERT.

如果您使用 Windows 身份验证连接到 SQL Server,则 SQL Server 服务帐户在连接到文件服务器时会尝试模拟您的用户帐户。如果您使用 SQL Server 身份验证进行连接,它将以 SQL Server 服务帐户的身份连接到文件服务器。

如果委派和模拟配置不正确(默认状态),SQL Server 服务将无法模拟您的用户帐户,并将退回尝试以匿名用户身份连接到文件服务器。

这可以通过查看文件服务器上的安全事件日志来确认。这些事实以及有关配置无约束和约束委派的指南记录在以下链接中:

我已经尝试按照thesqldude的指南中的说明进行操作,但它仍然无法正常工作。

我尝试使用的数据库BULK INSERT不是可用性组的一部分,因此只有 MSSQL1 节点应该相关。文件服务器在 …

authentication sql-server availability-groups sql-server-2016 bulk-insert

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

SQL Server 跟踪文件中的持续时间单位

我在 SQL Server 2012 中生成了一个跟踪文件,不太确定持续时间的单位,以毫秒为单位?

在此处输入图片说明

performance sql-server sql-server-2012 trace

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

如何调查 BULK INSERT 语句的性能?

我主要是使用实体框架 ORM 的 .NET 开发人员。但是,因为我不想在使用 ORM时失败,所以我试图了解数据层(数据库)中发生了什么。基本上,在开发过程中,我启动分析器并检查代码的某些部分根据查询生成了什么。

如果我发现一些非常复杂的事情(ORM 甚至可以从相当简单的 LINQ 语句中生成糟糕的查询,如果编写不仔细)和/或繁重(持续时间、CPU、页面读取),我会将它放入 SSMS 并检查其执行计划。

它适用于我的数据库知识水平。但是, BULK INSERT 似乎是一种特殊的生物,因为它似乎不会产生 SHOWPLAN。

我将尝试说明一个非常简单的例子:

表定义

CREATE TABLE dbo.ImportingSystemFileLoadInfo
(
    ImportingSystemFileLoadInfoId INT NOT NULL IDENTITY(1, 1) CONSTRAINT PK_ImportingSystemFileLoadInfo PRIMARY KEY CLUSTERED,
    EnvironmentId INT NOT NULL CONSTRAINT FK_ImportingSystemFileLoadInfo REFERENCES dbo.Environment,
    ImportingSystemId INT NOT NULL CONSTRAINT FK_ImportingSystemFileLoadInfo_ImportingSystem REFERENCES dbo.ImportingSystem,
    FileName NVARCHAR(64) NOT NULL,
FileImportTime DATETIME2 NOT NULL,
    CONSTRAINT UQ_ImportingSystemImportInfo_EnvXIs_TableName UNIQUE (EnvironmentId, ImportingSystemId, FileName, FileImportTime)
)
Run Code Online (Sandbox Code Playgroud)

注意:表上没有定义其他索引

批量插入 (我在探查器中捕获的内容,仅一批)

insert bulk [dbo].[ImportingSystemFileLoadInfo] ([EnvironmentId] …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan sql-server-2014 bulk-insert

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

如何强制标量 UDF 在查询中只计算一次?

我有一个查询需要根据标量 UDF 的结果进行过滤。查询必须作为单个语句发送(因此我不能将 UDF 结果分配给局部变量)并且我不能使用 TVF。我知道标量 UDF 引起的性能问题,包括强制整个计划串行运行、过多的内存授予、基数估计问题和缺乏内联。对于这个问题,请假设我需要使用标量 UDF。

UDF 本身调用起来非常昂贵,但理论上查询可以由优化器在逻辑上以这样一种方式实现,即函数只需要计算一次。我为这个问题模拟了一个大大简化的例子。以下查询在我的机器上执行需要 6152 毫秒:

SELECT x1.ID
FROM dbo.X_100_INTEGERS x1
WHERE x1.ID >= dbo.EXPENSIVE_UDF();
Run Code Online (Sandbox Code Playgroud)

查询计划中的过滤器运算符表明该函数为每一行计算一次:

查询计划 1

DDL 和数据准备:

CREATE OR ALTER FUNCTION dbo.EXPENSIVE_UDF () RETURNS INT
AS
BEGIN
    DECLARE @tbl TABLE (VAL VARCHAR(5));

    -- make the function expensive to call
    INSERT INTO @tbl
    SELECT [VALUE]
    FROM STRING_SPLIT(REPLICATE(CAST('Z ' AS VARCHAR(MAX)), 20000), ' ');

    RETURN 1;
END;

GO

DROP TABLE IF EXISTS dbo.X_100_INTEGERS;

CREATE TABLE dbo.X_100_INTEGERS (ID INT NOT NULL);

-- insert 100 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server functions query-performance

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

我可以重构此查询以使其并行运行吗?

我有一个查询在我们的服务器上运行大约需要 3 个小时——而且它没有利用并行处理。(大约 115 万条记录dbo.Deidentified, 300 条记录dbo.NamesMultiWord)。服务器可以访问 8 个内核。

  UPDATE dbo.Deidentified 
     WITH (TABLOCK)
  SET IndexedXml = dbo.ReplaceMultiWord(IndexedXml),
      DE461 = dbo.ReplaceMultiWord(DE461),
      DE87 = dbo.ReplaceMultiWord(DE87),
      DE15 = dbo.ReplaceMultiWord(DE15)
  WHERE InProcess = 1;
Run Code Online (Sandbox Code Playgroud)

和ReplaceMultiword是一个过程定义为:

SELECT @body = REPLACE(@body,Names,Replacement)
 FROM dbo.NamesMultiWord
 ORDER BY [WordLength] DESC
RETURN @body --NVARCHAR(MAX)
Run Code Online (Sandbox Code Playgroud)

是呼吁ReplaceMultiword阻止形成平行计划吗?有没有办法重写它以允许并行?

ReplaceMultiword 以降序运行,因为某些替换是其他替换的简短版本,我希望最长的匹配成功。

例如,可能有“乔治华盛顿大学”和另一个来自“华盛顿大学”。如果“华盛顿大学”比赛是第一场,那么“乔治”就会被甩在后面。

查询计划

从技术上讲,我可以使用 CLR,只是我不熟悉如何使用。

performance sql-server parallelism sql-server-2016 query-performance

12
推荐指数
2
解决办法
838
查看次数

为什么并行(重新分区流)运算符会将行估计减少到 1?

我正在使用 SQL Server 2012 企业版。我遇到了一个 SQL 计划,它表现出一些我认为并不完全直观的行为。在执行大量并行索引扫描操作后,会发生并行(重新分区流)操作,但它会终止索引扫描 (Object10.Index2) 返回的行估计值,将估计值减少到 1。我已经进行了一些搜索,但是没有遇到任何可以解释这种行为的东西。查询非常简单,尽管每个表都包含数百万的记录。这是 DWH 加载过程的一部分,这个中间数据集在整个过程中被触及了几次,但我的问题特别与行估计有关。有人可以解释为什么在并行(重新分区流)运算符中准确的行估计值变为 1?还,

我已将完整计划发布到Paste the Plan。

这是有问题的操作:

在此处输入图片说明

包括计划树,以防添加更多上下文:

在此处输入图片说明

我能运行到的一些变化这个连接项目由保罗·怀特(进一步深入explination在自己的博客提交这里)?至少这是我发现的唯一一个似乎与我遇到的情况非常接近的东西,即使没有 TOP 运算符在起作用。

sql-server execution-plan sql-server-2012 cardinality-estimates

12
推荐指数
2
解决办法
7149
查看次数

SQL Server 日志是否记录未提交的操作?

我经常看到sql server log之类的语句记录了每一个交易和操作。

但我感到困惑,当交易最终会发生什么滚 回去。

假设一个显式事务有 3 个语句:statement A, statement B, statement C,最后是 a rollback statement D。

现在说当执行还没有到达时rollback statement D,是否statements A through C会记录到sql server日志中产生的修改?

理解1:

语句 A 到 D 都被记录下来。无论如何,SQL Server 都会记录一切。

理解二:修改只存储在内存中的某处,只有在SQL Server看到commit语句时才记录到日志中。如果结果是一个rollback语句,SQL Server 会简单地忽略事务,不会写入日志,因为它没有任何用途。换句话说,SQL Server时,有一个记录净结果之前和之后的交易。

两者似乎都合乎逻辑,至少对我而言,但它们不可能都是对的。谢谢你的帮助。

sql-server

12
推荐指数
2
解决办法
1435
查看次数

在 Python 中检索到的 SQL Server VARCHAR 列的编码问题

我们最近遇到了与在 SQL Server 中存储为 varchar(120) 的字段相关的编码问题。在 SSMS 中,varchar 显示为:

“谁杀了琼本?”

但是,当它被带入python时,它显示为:

在此处输入图片说明

我从 Python 方面对此进行了研究,并没有发生什么奇怪的事情。我的理论是 SQL Server 中的 varchar 接受 UTF-8 字符,这些字符在 python 中的显示方式与 SSMS 不同。我对 SQL Server 中的编码不是很熟悉。有人可以让我知道以下内容:

  • 在 SSMS 中有没有办法查看 varchar 的编码?例如,查看 \x82 而不是显示当前来自 SSMS 的逗号?
  • 我们正在使用 SQL Server 2008。有没有办法将任何 UTF-8 字符的编码更改为 ASCII 字符而不使用导入/导出工具或转储到平面文件?即我可以通过查询进行这种转换吗?
  • 有什么方法可以通过查询以编程方式识别有问题的记录(问题被定义为 ASCII 不支持的 UTF-8 字符)?

先感谢您!

使用sp_help N'table_name';我发现这个VARCHAR列的排序规则是:SQL_Latin1_General_CP1_CI_AS。

sql-server sql-server-2008-r2 utf-8 encoding python

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