小编Cha*_*ace的帖子

包含大量 ComputeScalar 操作的执行计划

我在使用和不使用 OPTION (RECOMPILE) 的情况下执行了相同的查询。当我比较这两个计划时,我看到的一个主要区别是,没有选项重新编译的计划显示了很多 ComputeScalar 运算符,而另一个则没有。

以下是两个计划:

不带选项重新编译:https://www.brentozar.com/pastetheplan/ ?id=S1OcZGi85 带选项重新编译:https://www.brentozar.com/pastetheplan/ ?id=ryJAfMsL5

为什么一个计划使用大量计算标量,而另一个计划则不使用?不带选项重新编译的查询需要近 4 分钟才能执行。计算标量操作是否导致速度缓慢?

sql-server execution-plan recompile query-performance

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

扩展事件、sp_reset_connection 和 sql_text

我在 3 台不同的服务器上运行了扩展的事件会话。我正在寻找长时间运行或过度调用的存储过程和内联查询(ORM,主要是 nHibernate)。

rpc_completed event_name 的输出显示 object_type 和 statements_text 的“sp_reset_connection”。但是,它还有一个在 sql_text 中捕获的查询。

扩展事件是否将 2 个执行 --sp_reset_connection 和查询 -- 作为单个事件捕获?我是否应该查看 sp_reset_connection 加上 sql_text 或 statements_text 中的查询的总时间的持续时间值?或者,它是否捕获 sp_reset_connection 并仅显示触发 sp_reset_connection 的查询?

我期望 sp_reset_connection 和查询是单独的事件。

澄清:为什么扩展事件会返回字段之间的冲突?

1. object_name = 'sp_reset_connection'
2. statement = 'exec sp_reset_connection'
3. sql_text = a query (ex: '(@p0 int)SELECT specificat0_.ScenarioId ...')
Run Code Online (Sandbox Code Playgroud)

为什么 sql_text 不同?在典型的扩展事件行 (XML) 中,3 个字段对于已执行的内容是一致的。这给我留下了一个问题:“什么被处决了?”。是否应将持续时间字段值分配给 sp_reset_connection?或者在sql_text中找到内联sql?或两者?

我了解 sp_reset_connection 是什么以及它是如何工作的。我不明白的是扩展事件是如何报告的。Profiler 在报告 sp_reset_connection 时没有歧义。

我的结论是扩展事件正在返回 sp_reset_connection 的结果。然而,这是基于我观察到的结论——即猜测。我需要更具体的东西:即使只有其他人得出相同的结论。

这篇文章表明我可以忽略sql_text。

https://www.sqlskills.com/blogs/jonathan/understanding-the-sql_text-action-in-extended-events/

感谢您的帮助。

sql-server

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

有没有办法删除插入的数据,反之亦然?

我正在尝试在同一查询中插入数据然后删除数据。

我试图将其分块删除,以免导致日志问题:

DECLARE @BatchSize INT
SET @BatchSize = 100000

WHILE @BatchSize <> 0
BEGIN 
   
DELETE (@BatchSize) TABLE1 
WHERE   LogType = 'LOGTYPE'
AND     TABLE1.Id NOT IN (SELECT Id FROM TABLE2)
AND     TABLE1.Id IN     (SELECT Id FROM DifferentDB..TABLE3)
    
   SET @BatchSize = @@rowcount 
END
Run Code Online (Sandbox Code Playgroud)

但同样的查询,我想先在辅助数据库中插入数据,然后删除。

是否可以在没有触发器的情况下实现?(插入、删除……)

我也愿意接受更好的分块删除方法,我只是凭记忆得到了这个方法。

sql-server t-sql sql-server-2014

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

清除 TEXT 列后减小表大小的注意事项

我有第三部分应用程序,其中有一个 450GB 的表,其中在 TEXT 列中包含文件附件(是的,我知道)。通过文档保留角度,我已使用便携式驱动器将大约 35% 的旧附件导出到磁盘。TEXT 列现在有一条注释,表明附件已存档(有利于应用程序的 UI) - 从多个 MB/GB 减少到不到 1KB。

我知道反对缩小数据库的论点。我从这个论坛收集的选项包括(1)复制表、删除原始表、重命名副本、(2)使用 xp_cmdshell 'bcp...' 导出表、截断表、使用 BULK INSERT 从 'c: 导入数据。 ..' 和 ...; (3) 运行 ALTER INDEX ALL ON dbo.Table REORGANIZE WITH (LOB_COMPACTION = ON)

我最关心的是 SQL Server 将用于任何选项的资源(磁盘空间、CPU、内存...),特别是考虑到表的大小。至于时间,如果需要,我可以阻止周末时间,但是日志文件、临时数据库文件等呢?在开始使用这些选项中的任何一个之前,我应该设置/更改哪些设置?

该服务器具有 160GB 内存,其中 128GB 用于 SQL Server (2016),2 个节点,配有 20 个处理器,每个节点在 MS Windows Server 2012 R2 标准上额定频率为 2.2 GHz。

index sql-server blob sql-server-2016 index-maintenance

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

创建存储过程时排序规则冲突

我正在尝试创建一个存储过程,但它给了我错误消息
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_BIN2" in the EXCEPT operation.

问题是数据库和服务器排序规则都是SQL_Latin1_General_CP1_CI_AS,但我不知道Latin1_General_BIN2排序规则来自哪里。

create procedure [ETL_1.4.0].update_valve_event_type
(
    @data nvarchar(max)
)
as
    declare @mismatch_table table(id int, [name] varchar(50))

    if isjson(@data) = 0
    begin
        ;throw 50000,'Input argument @data is invalid JSON.', 1
    end

    insert @mismatch_table (id, [name])
    select * from
    (
        select
            value as id,
            [key] as [name]
        from openjson(@data)
        except
        select
            id,
            [name]
        from enum.valve_event
    )data

    --clear mismatches that are deemed ok, e.g. spelling corrections …
Run Code Online (Sandbox Code Playgroud)

sql-server collation json sql-server-2019

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

升级不再支持 Microsoft SQL 实例多个问题?

我刚刚找到了一份分析师的新工作,但我\xe2\x80\x99m 的任务是执行管理员任务,只是在寻找洞察力。

\n

我们有一台 Windows Server 2003(32 位),其中有 Microsoft SQL Server 2005。我的任务是将其升级到最新的 Windows 和 SQL Server。

\n

由于 sql 服务器和主机操作系统多年来一直不受支持,我认为创建新服务器并在新服务器上恢复数据库备份可能会更容易。\n我的问题是:

\n
    \n
  1. 可以恢复 32 位 SQL Server 备份的最新操作系统和 SQL Server 版本是什么?(新操作系统和 SQL 服务器将是 64 位)
  2. \n
  3. 如果操作系统和 SQL 服务器都是 64 位,与数据库交互时我是否仍会受到 4GB RAM 的限制?或者操作系统的版本决定了内存?
  4. \n
  5. 我可以备份整个实例(最好使用本地用户信息)还是单独备份每个数据库?
  6. \n
  7. 如果您有类似的经历,您建议我要注意的第一件事是什么?
  8. \n
\n

相关信息

\n
    \n
  • 新旧服务器都是我通过VMware创建的VM\xe2\x80\x99s
  • \n
  • 许可不是一个因素,所以如果我需要多个步骤也没关系
  • \n
  • 几十个使用 Windows 10&11 以及 Ubuntu 16、18、20 和 22 的用户与 sql server 进行交互
  • \n
\n

sql-server-2005 sql-server windows-server

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

自签名证书是 SQL Server Always Encrypted 的标准做法吗?

我们正在 2019 年环境中实施 SQL Server Always Encrypted。在过去的几个月里,我们已经完成了几次成功的 POC,但在将解决方案转移到 Prod 时,我希望使用公共可信 CA 来获取证书。但现在,回顾网络上大约 10 个 AE 教程,包括 Microsoft 官方说明,我发现从未提及过使用公共可信 CA。这里甚至有一篇文章询问使用受信任的 CA 证书是否会带来任何好处,并且建议不会。

我正在努力满足我们在全公司范围内推出的所有安全计划,所以我想我正在尝试找到某种我可以指出的标准答案。

我一直在谈论自签名证书如何受到中间人攻击,但我想我开始意识到这仅适用于正在建立的 SQL 连接以及流经该连接的任何数据(因为表中的数据未加密,SSL 对其进行加密)。但对于AE来说,数据库中的数据已经只是一个加密的字符串。

那么,如果始终加密解决方案的本质是在从未创建或存在于保存数据的同一服务器上的自签名证书的情况下完成,是否可以排除任何 MIM 攻击?简单地使用自签名证书是公认的“标准”方式吗?经过深思熟虑,我相信答案是肯定的,但只是想要某种“官方”答案,哈哈。

sql-server certificate always-encrypted

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

如何验证 SQL Server 是否启用了强制加密

我想知道是否有人知道查询 SQL Server 的“强制加密”是否设置为 true 的方法。

我知道我可以检查sys.dm_exec_connections当前连接是否已加密,但这并不能真正得到我想要的东西。false如果客户端请求加密,即使设置为“强制加密”,所有连接仍然可以加密。

我正在构建一个报告,扫描我们环境中的所有 SQL 服务器,以针对我们的最佳实践设置进行测试,以便我们可以修复错误配置的系统。由于报告将按计划运行,依赖sys.dm_exec_connections可能会给我一种错误的安全感,因为在报告运行时所有连接都可以加密,但五秒钟后某些连接未加密。我们的目标是尝试让所有 SQL 服务器强制加密,然后能够报告异常情况。

sql-server

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

我可以用两年前的 ldf 恢复当前的 mdf 吗?

我的 SQL Server 2000(又名版本 8.0)在电源故障后无法恢复数据库。我发现的唯一备份是当前的 mdf 文件和两年前的 ldf 文件。

我可以使用当前的 mdf 文件和旧的 ldf 文件恢复数据库吗?

sql-server sql-server-2000

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

DELETE 查询后数据库大小增加

我在 SQL Server 2019 的一个表中有一个数据库,其中包含大量 varbinary(MAX) 重复记录。我们需要删除重复项,因此我运行了删除查询来删除重复项。数据库大小在删除语句之前没有保持不变,而是在查询完成后增加。我即将应用 DBCC SHRINKFILE(N'myDatabase', 0),但我真的很好奇为什么数据库大小会增加。附件是我的删除查询。

DELETE from Document WHERE DocumentId in 
(
    SELECT t.DocumentId
    FROM (
        SELECT s.*,
          ROW_NUMBER() OVER (PARTITION BY s.DocumentName, s.SubmitDateTime, s.DocumentType ORDER BY s.DocumentName, s.SubmitDateTime, s.DocumentType) AS [RowCount]
        FROM Document s
        LEFT OUTER JOIN Staging b ON s.DocumentId = b.DocumentId
        LEFT OUTER JOIN RejectTable r ON  s.DocumentId = r.DocID
        WHERE b.DocumentId IS NULL
          AND r.DocID IS NULL
          AND s.SubmitDateTime IS NOT NULL
          AND s.InsertDateTime IS NOT NULL
          AND s.DocumentName IS NOT …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2019

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

更正代码

请帮助纠正以下代码。

select *
from openquery(DRUPAL,
    'select o.*
     from (
       select
         max(vid),
         nid
       from content_type_irb_application_form
       group by nid
     )  i
     inner join content_type_irb_application_form  o  on o.nid = i.nid and o.vid = i.vid
  ')
Run Code Online (Sandbox Code Playgroud)

消息 7321,级别 16,状态 2,第 1 行 准备查询“select o.* from (select max(vid), nid from content_type_irb_application_form group by nid) i inner join content_type_irb_application_form o on o.nid = i 时发生错误。 nid 和 o.vid = i.vid”,用于针对链接服务器“DRUPAL”的 OLE DB 提供程序“MSDASQL”执行。

join sql-server

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