我有一个存储过程,它在 12/11 之前运行良好,平均执行时间不到 2 小时。从周二(12/11)开始,存储过程连续运行了3个多小时,不得不手动杀死并重新运行。
需要注意的一件事是,无论何时运行该特定存储过程,处理器利用率都会高达 95%。我们有描述相同的 SQLMonitor 工具 -
为了消除参数嗅探的可能性,我清除了 proc 缓存,DBCC FREEPROCCACHE并在美国东部标准时间上午 5:30 再次通过删除并重新创建它来重新运行该过程。即使在此之后,处理器利用率也会出现峰值。以下是清除 proc 缓存后的当前处理器利用率 -
以下是存储过程仅供参考 -
CREATE PROCEDURE [dbo].[Build_Base02_Orders]
AS
BEGIN
SET NOCOUNT ON;
declare @Start_Date datetime = getdate();
declare @Last_Date datetime
DECLARE @PROMOHIGHDATE INT = (SELECT MAX(FILE_DATE) FROM Stage1_Promotion);
--Create the Orders from Items
drop table WinstonBrand_Base.dbo.Orders;
With OrdersBase1 as
(
Select * from WinstonBrand.dbo.Stage3_Orders Orders
UNION ALL
Select * from …Run Code Online (Sandbox Code Playgroud) 我阅读了一篇文章,解释了在 SQL Server 中设置处理器关联性所带来的不良副作用。
我了解到,在大多数情况下,SQL Server 的默认设置效果最好,因为当我们设置处理器关联性时,我们正在使调度程序受 CPU 限制。我这里有几个问题:
当处理器关联性的默认设置效果最佳时,为什么需要显式设置处理器关联性?
文章还指出:
当跟踪标志 8002 打开时,调度程序不再绑定到 CPU。
是否有理由说跟踪标志 8002ON就像默认Processor affinity配置一样,只是 SQL Server 可用的核心数量较少?
例如,如果我们将 32 核处理器的处理器亲和性设置为 16 核(跟踪标志 8002 为ON),那么具有与其关联的 SQL 线程的调度程序是否只需16 cores切换?
设置处理器关联性会限制 SQL Server 计划程序使用某些核心。此设置是否还会限制其他 CPU 密集型进程(例如 .NET 应用程序)的核心使用情况?
我想说的是,如果对于 32 核 CPU,处理器亲和性设置为 16 核,那么 SQL Server 调度程序只有 16 核可供切换。如果是,那么另一个 CPU 密集型应用程序(例如 .NET 应用程序)又如何呢?.NET 应用程序是否可以在所有 32 个内核之间自由切换,因为它将依赖于 Windows 操作系统而不是SQLOS?
这只是我想象的一个假设场景。考虑到生产场景,我非常怀疑人们会在同一台服务器上使用 SSMS 和 CPU 密集型 .NET 应用程序。这将极大地影响性能并导致任何其他进程的 CPU 可用性不足。如果我在这里错了,请纠正我。
我们有一个每天运行的存储过程。在其中一个子查询(执行计划中的查询 20)中,SQL Server 在 2021 年 9 月 24 日之前一直使用索引查找。但突然间,当查询在 2021/09/25 运行时,SQL Server 在同一步骤开始使用索引扫描。
以下是 2021 年 9 月 24 日执行搜寻的计划
以下是 2021 年 9 月 25 日 SQL Server 执行索引扫描的计划
EMAIL_SENDS_CCMP_LTD 表是一个相当大的表,下面是该表的空间使用数据
以下是上面突出显示的存储过程中的查询 -
insert into TALBOTS_BASE.dbo.EMAIL_ACTIVITIES
(EMAILTYPE,INTSOURCE,EMAIL,ACCTNO,FNAME,LNAME,EMAILDATE,DNEFLAG,SOURCE_CD,CREATE_ID,EMAILPREF,HASH,FILENAME,SEQ,FILEDATE,MODDATE,IPADDRESS,HAV_EMAILDATE)
SELECT
'OPEN' AS EMAILTYPE
,'CCMP' AS INTSOURCE
, a.[P_email] AS EMAIL
,'' AS ACCTNO
,'' AS [FNAME]
,'' AS [LNAME]
,CASE WHEN ISNULL(c.Subchannel,'')<>'HWW'
THEN
CASE WHEN ISDATE([click_time])=1 THEN CAST([click_time] AS DATE) ELSE NULL END
ELSE NULL
END AS EMAILDATE
,'' as …Run Code Online (Sandbox Code Playgroud) 我必须对数据库进行未加密的完整备份,以便将其发送给其他团队,然后他们可以在自己的环境中恢复它。另一个团队有不同的环境和不同的 SQL Server 证书。
我的完整备份服务器设置是进行AES 128加密备份。而且我不打算与其他团队共享解密密钥和证书。我的 SQL Server 版本是 Standard 2014 SP2。
我见过加密备份,但我还没有遇到过这种情况。有没有人遇到过这种类型的场景。任何帮助将不胜感激。
编辑 -
就我而言,所有 SQL Server 数据库备份都使用自签名证书进行加密。此证书安装在所有服务器上,因此只需管理一个证书。如果证书过期,则需要续订,因为备份将不会使用过期的证书运行。此外,需要加载证书和私钥以恢复使用密钥对创建的备份。
这是我不打算与其他团队共享的证书和私钥。因此,需要可以绕过证书加密的仅复制完整备份。有什么办法,我可以通过创建一个不需要加载证书和私钥的备份来解决上述情况。
按照learning-dbadmin 的要求添加查询的输出-