我正在使用扩展事件收集阻塞的进程报告,并且由于某些原因,在某些报告中该blocking-process节点为空。这是完整的xml:
<blocked-process-report monitorLoop="383674">
<blocked-process>
<process id="processa7bd5b868" taskpriority="0" logused="106108620" waitresource="KEY: 6:72057613454278656 (8a2f7bc2cd41)" waittime="25343" ownerId="1051989016" transactionname="user_transaction" lasttranstarted="2017-03-20T09:30:38.657" XDES="0x21f382d9c8" lockMode="X" schedulerid="7" kpid="15316" status="suspended" spid="252" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2017-03-20T09:39:15.853" lastbatchcompleted="2017-03-20T09:39:15.850" lastattention="1900-01-01T00:00:00.850" clientapp="Microsoft Dynamics AX" hostname="***" hostpid="1348" loginname="***" isolationlevel="read committed (2)" xactid="1051989016" currentdb="6" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame line="1" stmtstart="40" sqlhandle="0x02000000f7def225b0edaecd8744b453ce09bdcff9b291f50000000000000000000000000000000000000000" />
<frame line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" />
</executionStack>
<inputbuf>
(@P1 bigint,@P2 int)DELETE FROM DIMENSIONFOCUSUNPROCESSEDTRANSACTIONS WHERE ((PARTITION=5637144576) AND ((FOCUSDIMENSIONHIERARCHY=@P1) AND (STATE=@P2))) </inputbuf>
</process>
</blocked-process>
<blocking-process>
<process />
</blocking-process>
</blocked-process-report>
Run Code Online (Sandbox Code Playgroud)
此 hobt_id 所属索引的索引定义是
CREATE UNIQUE …Run Code Online (Sandbox Code Playgroud) sql-server profiler extended-events sql-server-2012 blocking
我有两张桌子
@T1 TABLE
(
Id INT,
Date DATETIME
)
@T2 TABLE
(
Id INT,
Date DATETIME
)
Run Code Online (Sandbox Code Playgroud)
这些表在 (Id, Date) 上有一个非聚集索引
我加入这些表
SELECT *
FROM T1 AS t1
INNER JOIN T2 AS t2
ON
t1.Id = t2.Id
WHERE
t1.Date <= GETDATE()
AND
t2.Date <= GETDATE()
Run Code Online (Sandbox Code Playgroud)
这也可以写成
SELECT *
FROM T1 AS t1
INNER JOIN T2 AS t2
ON
t1.Id = t2.Id
AND
t1.Date <= GETDATE()
AND
t2.Date <= GETDATE()
Run Code Online (Sandbox Code Playgroud)
我的问题是,这两个查询中哪一个提供了更好的性能,为什么?或者他们是平等的?
我设置了一个 Always On Availability Group,我想确保我的用户在他们的连接字符串中使用 ApplicationIntent=ReadOnly。
从 SQL Server 通过 DMV(或扩展事件或其他),我能否判断用户是否在其连接字符串中使用 ApplicationIntent=ReadOnly 进行连接?
请不要回答如何防止连接 - 这不是这个问题的内容。我不能简单地停止连接,因为我们现有的应用程序在没有正确字符串的情况下进行连接,我需要知道它们是哪些,以便我可以与开发人员和用户合作,随着时间的推移逐渐修复它。
假设用户有多个应用程序。例如,Bob 与 SQL Server Management Studio 和 Excel 连接。他需要更新时使用 SSMS,需要读取时使用 Excel。我需要确保他在与 Excel 连接时使用 ApplicationIntent=ReadOnly。(这不是确切的场景,但足以说明。)
在我们的数据库中,我们有多个带有 caron/hatschek 的条目。现在我们的用户希望在搜索没有的条目时找到包含 caron/hatschek 的条目。我将通过一个简单的例子来说明这一点:
在我们的数据库中,我们有条目(联系人姓名)
Millière
Run Code Online (Sandbox Code Playgroud)
所以这个名字在这个人居住的国家是正确的。
在我们国家,我们没有任何带有 caron/hatschek 的字符,因此我们的用户搜索Milliere. 没有结果出现,因为è显然不匹配e。
我不知道这是如何实现的,因为é, è,ê还有更多可用的(这只是字母的一个例子e......)。
(另一种方法会容易得多,因为我可以简单地将所有带有 caron/hatschek 的字母替换为基本字母。显然,我们的用户确实想要数据库中名称的正确版本,而不是残缺的名称。)
我想将数据库中可用的特定表备份到一个.bak文件中,所有这些都应该使用 T-SQL 脚本来完成。
我正在将一些 XML 数据插入 SQL Server 中的 XML 列,但在插入数据后,它已被 sql server 更改。这是我插入的数据
<xsl:value-of select="name/n/given" />
<xsl:text> </xsl:text>
<xsl:value-of select="name/n/family" />
Run Code Online (Sandbox Code Playgroud)
当我读回来时,它看起来像这样
<xsl:value-of select="name/n/given" />
<xsl:text />
<xsl:value-of select="name/n/family" />
Run Code Online (Sandbox Code Playgroud)
注意第二行。这是一个问题,因为它改变了 XSLT 转换输出的方式。第一个例子将在给定和姓氏之间创建一个空格,而第二个不会创建任何空格,所以它会像约翰约翰森,而第一个会像约翰约翰森。
有没有办法解决这个问题?
我遇到了一个查询的性能问题,我似乎无法理解。
我从游标定义中提取了查询。
此查询需要几秒钟才能执行
SELECT A.JOBTYPE
FROM PRODROUTEJOB A
WHERE ((A.DATAAREAID=N'IW')
AND ((A.CALCTIMEHOURS<>0)
AND (A.JOBTYPE<>3)))
AND EXISTS (SELECT 'X'
FROM PRODROUTE B
WHERE ((B.DATAAREAID=N'IW')
AND (((((B.PRODID=A.PRODID)
AND ((B.PROPERTYID=N'PR1526157') OR (B.PRODID=N'PR1526157')))
AND (B.OPRNUM=A.OPRNUM))
AND (B.OPRPRIORITY=A.OPRPRIORITY))
AND (B.OPRID=N'GRIJZEN')))
AND NOT EXISTS (SELECT 'X'
FROM ADUSHOPFLOORROUTE C
WHERE ((C.DATAAREAID=N'IW')
AND ((((((C.WRKCTRID=A.WRKCTRID)
AND (C.PRODID=B.PRODID))
AND (C.OPRID=B.OPRID))
AND (C.JOBTYPE=A.JOBTYPE))
AND (C.FROMDATE>{TS '1900-01-01 00:00:00.000'}))
AND ((C.TODATE={TS '1900-01-01 00:00:00.000'}))))))
GROUP BY A.JOBTYPE
ORDER BY A.JOBTYPE
Run Code Online (Sandbox Code Playgroud)
实际的执行计划是这样的。

注意到服务器范围的设置被设置为 MaxDOP 1,我尝试使用 maxdop 设置。
添加OPTION (MAXDOP 0)到查询或更改服务器设置会导致更好的性能和此查询计划。

但是,有问题的应用程序(Dynamics AX)不会执行这样的查询,它使用游标。 …
performance sql-server parallelism cursors microsoft-dynamics query-performance
我需要备份 10-20 个大小在 10-50 GB 之间的 SQL Server 2008 R2 数据库,同时它们在线并由单个企业应用程序同时使用。我还需要将它们恢复到在所有数据库之间基本同步的状态(我可以承受数据库之间长达几秒钟的不同步)。目的是为 QA/DEV 环境捕获生产数据。
我强烈希望不要求数据库在完全恢复中运行,并提出一种备份方法,该方法专用于为 QA 环境捕获数据,并保持独立于不受我控制的主备份过程。
对于我的客户,捕获 20 个完整备份(每个约 30 GB)需要 1-2 小时。这使得按顺序进行完整备份是不可接受的,因为在简单恢复中运行时数据库会过于不同步。
我正在寻找比这些更好的想法:
想法 1:虚拟机磁盘的 SAN 级快照。从快照 xcopy MDF/LDF。
一旦复制的文件附加到不同的服务器实例,其恢复过程应该生成几乎同时快照的一致数据库。
谷歌搜索使我确信这是一个坏主意,至少因为我可能会与 master/msdb/etc 不同步。
IDEA 2:在所有数据库中编排复杂的备份和同步还原
这要求我要求以完全恢复运行的数据库,这是我不想要的。在截止日期 (T0) 之前为所有数据库启动并行备份。到达 T0 后,备份所有日志(最多需要几分钟)。获取由此产生的无数备份并尝试恢复它们并向前/向后滚动日志,以获得相对于 T0 的跨数据库某种程度的一致状态。
这需要大量的计划和脚本才能可靠地使用它,所以我会竭尽全力避免它。
PS1:我希望能够使用db snapshots。这个想法是在每个数据库上启动一个快照(应该在几秒钟内结束),然后在接下来的几分钟/几小时内按顺序完全备份每个。然后在不同的服务器上恢复所有这些并将每个恢复到快照。AFAIK 这种情况是不可能的,因为快照不能与数据库一起备份。它们只能在创建它们的服务器上就地回滚。此外,他们需要企业版,我没有为所有客户提供。
PS2:如果您知道能够生成跨数据库同步备份的 3rd 方解决方案,请提及它。
在SQL Server 2012中,服务帐户创建为虚拟账户(VAS),如所描述这里,而不是托管服务帐户(MSAS)。
根据描述,我可以看到这些重要的区别:
还有其他区别吗?如果不使用 Kerberos,为什么 DBA 会更喜欢 MSA?
更新:另一位用户在有关 VA 的 MS 文档中注意到了一个可能的矛盾:
虚拟账户是自动管理的,虚拟账户可以在域环境中访问网络。
相对
虚拟帐户无法在远程位置进行身份验证。所有虚拟账户都使用机器账户的权限。以 格式提供机器帐户
<domain_name>\<computer_name>$。
什么是“机器账号”?它如何/何时/为什么被“配置”?“在域环境中访问网络”和“在[域环境中]对远程位置进行身份验证”之间有什么区别?
所以我有一个简单的批量插入过程来从我们的临时表中获取数据并将其移动到我们的数据集市中。
该过程是一个简单的数据流任务,默认设置为“每批行数”,选项为“tablock”和“无检查约束”。
桌子相当大。587,162,986 数据大小为 201GB,索引空间为 49GB。表的聚集索引是。
CREATE CLUSTERED INDEX ImageData ON dbo.ImageData
(
DOC_ID ASC,
ACCT_NUM ASC,
MasterID ASC
)
Run Code Online (Sandbox Code Playgroud)
主键是:
ALTER TABLE dbo.ImageData
ADD CONSTRAINT ImageData
PRIMARY KEY NONCLUSTERED
(
ImageID ASC,
DT_CRTE_DOC ASC
)
Run Code Online (Sandbox Code Playgroud)
现在我们遇到了一个问题,BULK INSERT通过 SSIS 运行速度非常慢。1 小时插入一百万行。填充表的查询已经排序,并且要填充的查询运行时间不到一分钟。
当进程运行时,我可以看到等待 BULK insert 的查询需要 5 到 20 秒,并显示等待类型为PAGEIOLATCH_EX. 该过程一次只能处理INSERT大约一千行。
昨天在我的 UAT 环境中测试这个过程时,我遇到了同样的问题。我运行了几次这个过程并试图确定这个缓慢插入的根本原因是什么。然后突然间它在不到 5 分钟的时间内开始运行。所以我又跑了几次,结果都是一样的。此外,等待 5 秒或更长时间的批量插入的数量从数百个下降到大约 4 个。
现在这令人困惑,因为我们的活动并没有大幅下降。
持续时间内的 CPU 低。
当它变慢时,磁盘上的等待似乎更少。
在进程运行不到 5 分钟的时间范围内,磁盘延迟实际上会增加。
在此过程运行不佳期间,IO 低得多。
我已经检查过并且没有文件增长,因为文件只有 70% 已满。日志文件还有 50% 的时间要处理。数据库处于简单恢复模式。DB …