我有 SQL Server 2016 SP2 (13.0.5237.0)。这是我最近在系统中注意到的死锁图。死锁优先级高的进程被选为牺牲品(可能是因为与其他进程相比日志使用率高)。但这不应该发生。这是 SQL 中引入的缺陷吗?有没有办法防止死锁优先级高的进程成为受害者?这是死锁xml:
<deadlock>
<victim-list>
<victimProcess id="process1d3ea515848" />
</victim-list>
<process-list>
<process id="process1d3ea515848" taskpriority="10" logused="5800" waitresource="OBJECT: 9:290100074:0 " waittime="4711" ownerId="359850034" transactionname="user_transaction" lasttranstarted="2019-07-31T08:12:25.267" XDES="0x1d2f62d1840" lockMode="Sch-M" schedulerid="3" kpid="10320" status="suspended" spid="52" sbid="0" ecid="0" priority="5" trancount="4" lastbatchstarted="2019-07-31T08:13:30.990" lastbatchcompleted="2019-07-31T08:13:29.427" lastattention="1900-01-01T00:00:00.427" clientapp=".Net SqlClient Data Provider" hostname="XXX" hostpid="14944" loginname="NT AUTHORITY\SYSTEM" isolationlevel="read committed (2)" xactid="359850034" currentdb="9" currentdbname="XXX" lockTimeout="4294967295" clientoption1="673415200" clientoption2="128056">
<executionStack>
<frame procname="CreatePartition" line="30" stmtstart="2052" stmtend="2218" sqlhandle="0x03000900d670d75323ec7f0094aa000001000000000000000000000000000000000000000000000000000000">
ALTER PARTITION FUNCTION... </frame>
<frame procname="CreatePartitions" line="26" stmtstart="1618" stmtend="1788" sqlhandle="0x030009000f95cb5424ec7f0094aa000001000000000000000000000000000000000000000000000000000000">
EXEC CreatePartition </frame>
</executionStack>
<inputbuf>
Proc [Database …
Run Code Online (Sandbox Code Playgroud) 我有一个叫做设备的表。将存储在此表中的大多数设备都可以通过其序列号和部件号进行唯一标识。但是有些设备类型没有分配给它们的序列号和部件号。相反,它们可以由另一个字段(内部 ID)唯一标识。
我应该为此表创建代理键,还是应该创建复合主键(序列号、零件号、内部 ID)并在未提供序列号和零件号列时插入默认值?现在没有部件号和序列号的设备类型将在未来版本中分配给它们编号(可能是 5 年后)。在这种情况下,我应该创建代理键还是复合键?或者使用三个唯一属性,我应该在程序中创建一个哈希并将其用作表的代理键吗?
我在SQL Server
数据库中有几个带有可为空列的表。这些可为空的属性要么在行创建时未提供,要么在某些情况下不适用。
我意识到NULL
在某些情况下我不能使用相同的值来表示“未提供”,而在其他情况下则表示“不适用”。这些可选列的类型的int
,datetime
和string
。即使我标记string
为强制性(列NOT NULL
),要么设置的属性为“未提供”和“不适用”合适,怎么做int
和datetime
列?我从书中阅读了第 23 章:
数据库探索:CJ Data 和 Hugh Darwen 关于第三宣言的论文
看起来状态列只有数值,但由于作者设置了 'n/a' 和 'd/k'(不知道),不确定他们是否将状态创建为字符串列。将所有可选列创建为字符串列并在属性没有值时捕获属性中的原因是否是个好主意?
我在使用和不使用 OPTION (RECOMPILE) 的情况下执行了相同的查询。当我比较这两个计划时,我看到的一个主要区别是,没有选项重新编译的计划显示了很多 ComputeScalar 运算符,而另一个则没有。
以下是两个计划:
不带选项重新编译:https://www.brentozar.com/pastetheplan/ ?id=S1OcZGi85 带选项重新编译:https://www.brentozar.com/pastetheplan/ ?id=ryJAfMsL5
为什么一个计划使用大量计算标量,而另一个计划则不使用?不带选项重新编译的查询需要近 4 分钟才能执行。计算标量操作是否导致速度缓慢?