标签: sql-server

SQL Server 2016 的内存利用率

我在 Windows Server 上运行 SQL Server 2016 企业版,内存为 128 GB。在安装过程中,我为 SQL 服务器分配了 124 GB,因为该服务器仅专用于 SQL,其余的留给操作系统。

现在,当 DML/DDL 查询运行或任何维护计划运行时,每个任务管理器的内存消耗飙升至 97%。但。PLE 保持良好状态(即 > 300 秒)并且未观察到性能问题。一旦作业和查询完成,SQL 在相当长一段时间内不会释放内存,我必须进行内存上限或等待一整天才能释放内存。

除了内存上限之外,还有什么方法可以让 SQL Server 释放内存以及为什么 SQL 无法在所有作业完成后立即释放内存。

sql-server memory sql-server-2016 enterprise-edition performance-tuning

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

SQL 主查询子查询中 WHERE 中使用的值

我真的对这里的 SQL 感到困惑,我有这个示例,其中我在子查询中使用主查询的值,然后使用 XML PATH 在日期之间添加逗号。设置是两张表,其中一张是我想要串在一起的日期。我不确定为什么子查询 where 语句没有重新调整正确的结果。

http://www.sqlfiddle.com/#!5/5443b/2

设置

CREATE TABLE log
    ([logID] [int] NULL, 
     [LogDate] [datetime] NULL
    )
;

CREATE TABLE logdata
    ([logdataID] [int] NULL, 
     [logID] [datetime] NULL
    )
;
    
INSERT INTO log
    ([logID], [LogDate])
VALUES
    (1, 2021-02-01),
    (1, 2021-02-02),
    (1, 2021-02-03),
    (3, 2021-03-12),
    (4, 2021-02-12)
;

INSERT INTO logdata
    ([logdataID], [logID])
VALUES
    (1, 1),
    (2, 2),
    (3, 3)
;
Run Code Online (Sandbox Code Playgroud)

我的尝试:

Select 
logID,
logdataID
LogDate =  (SELECT ',' + CAST(LogDate AS varchar) FROM log WHERE logID =  logID …
Run Code Online (Sandbox Code Playgroud)

sql-server subquery

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

SQL Server 备份日志 - 很长时间没有运行,可能会出现什么问题?

重新启动后,SQL Server 上意外未启用 SQL 代理,并且 3 周内没有运行任何作业,包括没有备份(完整、差异或日志)。SQL 代理现已启用。数据库的完整备份已运行。现在日志备份正在运行,并且已经运行了一个多小时(通常在完整备份运行后需要几秒钟)。

有什么潜在的问题需要考虑吗?日志文件变得非常大,大约 200 GB。

sql-server backup transaction-log

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

为什么当我关闭 SQL Server 故障转移群集实例中的 SQL 服务时,没有发生自动故障转移?

我遇到了与自动故障转移相关的异常行为,因此在关闭 SQL Server 服务的情况下自动故障转移不起作用。集群磁盘似乎仍然连接到故障节点,但我无法找出导致此行为的最终问题。如果您能帮助我理解这个问题,我将非常感谢您。

出于测试目的,我在域控制器上创建了 iSCSI 目标,并连接了 2 个启动器:

在此输入图像描述

以下是有关我的集群的详细信息:

在此输入图像描述 在此输入图像描述 在此输入图像描述

以下是有关我的 SQL Server 服务的详细信息:

在此输入图像描述 在此输入图像描述 在此输入图像描述

以下是有关集群磁盘的详细信息(我只添加了其中一个磁盘的详细信息,因为两个磁盘是相同的):

在此输入图像描述 在此输入图像描述

现在,当我关闭 SQL Server 服务时,不会发生服务的自动故障转移:

在此输入图像描述

我测试了自动故障转移成功运行的其他场景:

  1. 手动故障转移
  2. 关闭活动节点
  3. 在活动节点上禁用适配器
  4. 在任务管理器中杀死sql server进程
  5. 在任务管理器中杀死sql代理服务进程

在上述所有场景中,资源均成功故障转移到另一个节点。

您能否帮我弄清楚当我关闭活动节点上的 SQL Server 服务时自动故障转移出了什么问题?

sql-server clustering failover sql-server-2014 failover-cluster-instance

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

SQL Server - SELECT 语句采用排它锁 - 为什么?

我试图理解为什么 SQL Server (2014) 在死锁场景中放置独占键锁。我已将整个死锁图粘贴在下面。

我很困惑,因为死锁发生在两个 SELECT 语句之间,两者都作为单个 READ COMMITTED 语句运行,而不是在事务内运行(因此同一事务中的其他地方没有发生更新等)。

我相信发生死锁是因为每个进程都在索引上创建一系列键锁,并且由于获取它们的顺序,所以发生了死锁。但是,如果进程仅创建共享锁,则不应出现死锁(根据我的理解)!

所以根本问题是 - 为什么这些 SELECT 语句会获取独占键锁?

我希望这只是我对锁定的误解。任何建议将不胜感激。

    <deadlock>
  <victim-list>
    <victimProcess id="processd7f647848" />
  </victim-list>
  <process-list>
    <process id="processd7f647848" taskpriority="0" logused="25948" waitresource="KEY: 32:72057594051428352 (e2d15ad895e9)" waittime="5014" ownerId="394724294049" transactionname="user_transaction" lasttranstarted="2022-04-06T09:46:18.770" XDES="0x67bf873350" lockMode="S" schedulerid="15" kpid="26196" status="suspended" spid="306" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2022-04-06T09:46:18.783" lastbatchcompleted="2022-04-06T09:46:18.783" lastattention="1900-01-01T00:00:00.783" clientapp=".Net SqlClient Data Provider" hostname="myhost" hostpid="1500" loginname="myuser" isolationlevel="read committed (2)" xactid="394724294049" currentdb="32" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056">
      <executionStack>
        <frame procname="MyDatabase.Main.GetMessages" line="154" stmtstart="11934" stmtend="12156" sqlhandle="0x03002000ebd98264d1bfae0066ae000001000000000000000000000000000000000000000000000000000000">
SELECT ID, Message FROM [dbo].[Messages] WHERE MessageType = @Type …
Run Code Online (Sandbox Code Playgroud)

sql-server deadlock locking blocking deadlock-graph

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

设置 max dop = cpu 数量会导致单个查询阻塞其他查询的情况吗?

我有 8 个 CPU 的 SQL Server。最大工作线程设置为 850。最大 dop 为 8。并行性的成本线程保持为 50。

这意味着 sql server 会将高于成本阈值的查询分解为 8 个线程。由于每个线程都在一个 cpu 上运行,那么这是否意味着在当前运行的 8 个线程中至少有一个被释放之前,不允许其他用户运行查询?

那么设置 max dop = cpu 数量会导致单个查询阻塞其他查询的情况吗?

sql-server maxdop

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

暂时开启级联删除

以前可能有人问过这个问题,但我找不到答案。

我在 sql-server-20XX (更可能是旧的)中有一个复杂的数据模型,其中级联删除已被关闭(按设计)。

我们的数据库的很大一部分已经被出售(我可以在顶层进行区分),并且我们有理由想要删除这些数据。我想在一个脚本中执行此操作,其中我首先打开级联删除,然后删除所有数据,然后再次关闭级联删除,但我找不到正确的语法。

需要提及的相关事项:

  • 我想从总共 10-15 个表中删除大约 40% 的行,这些行都以某种方式 1:n-1:n...-耦合到组织表
  • 性能无关紧要,因为该应用程序不在工作时间之外使用

这些表必须保留,我需要删除组织表中的 10/33 行,并且需要删除与这些组织耦合的订单、用户...等中的所有行

sql-server

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

SQL(在我的例子中是 SQL Server)如何评估多个列上的唯一约束?

给出下表

CREATE TABLE example (
    id int NOT NULL IDENTITY(1,1),
    strA NVARCHAR(10) NULL,
    strB NVARCHAR(10) NULL,
  CONSTRAINT [pk_id] PRIMARY KEY (id)
  CONSTRAINT [unq_str_combo] UNIQUE (strA, strB)
  CONSTRAINT [chk_one_is_null] CHECK ((strA IS NULL AND strB IS NOT NULL) OR (strA IS NOT NULL AND strB IS NULL))
);
Run Code Online (Sandbox Code Playgroud)

SQL 如何确定 strA 和 strB 列中的值组合是否是唯一组合?

以下任何INSERT陈述是否会失败?

INSERT INTO dbo.example (strA, strB) VALUES ('abc', NULL);    -- A
INSERT INTO dbo.example (strA, strB) VALUES (NULL, 'def');    -- B
INSERT INTO dbo.example (strA, …
Run Code Online (Sandbox Code Playgroud)

sql-server check-constraints unique-constraint

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

使用 TSQL 从字段中提取数字字符的最快方法是什么?

有一个包含 varchar(100) - OrderNum 字段值的大表,如下所示:

“BO2003056-2”

需要从此字段中提取所有数字字符,以便后续连接到另一个表。

例如:“BO2003056-2”将转换为“20030562”

由于 TSQL 中本身不存在 RegEx,那么在 TSQL 中执行此操作的最快方法是什么?

SQL 2019(数据库兼容模式 2014)

sql-server

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

exec 限制为 4000 个字符?

尝试执行此脚本仅给出第一个选择结果

declare @sp nvarchar(max)
select @sp = concat(N'select 1 ', replicate('-', 5000), char(13) + char(10), N'select 2')
exec (@sp)
Run Code Online (Sandbox Code Playgroud)

但是当我将连字符降低到 1000 时,我还得到了第二个选择 如何克服这个限制?

sql-server dynamic-sql exec

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