标签: sql-server

条件中的逻辑运算符 OR AND 和 WHERE 中的条件顺序

让我们检查这两个语句:

IF (CONDITION 1) OR (CONDITION 2)
...

IF (CONDITION 3) AND (CONDITION 4)
...
Run Code Online (Sandbox Code Playgroud)

如果CONDITION 1TRUE,会CONDITION 2被检查吗?
如果CONDITION 3FALSE,会CONDITION 4被检查吗?

条件如何WHERE:SQL Server 引擎是否优化WHERE子句中的所有条件?程序员是否应该以正确的顺序放置条件以确保 SQL Server 优化器以正确的方式解析它?

添加:

感谢 Jack 提供链接,来自 t-sql 代码的惊喜:

IF  1/0 = 1 OR 1 = 1
      SELECT 'True' AS result
ELSE
      SELECT 'False' AS result


IF  1/0 = 1 AND 1 = 0
      SELECT 'True' …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server optimization t-sql condition

38
推荐指数
2
解决办法
14万
查看次数

我如何阅读查询成本,它总是一个百分比吗?

我目前正在学习 SQL 70-433(Microsoft 认证考试),我对“查询成本”性能指标感到非常困惑。

根据我可以通过谷歌找到的任何文档,查询成本是一个百分比数字,代表整个批次的任何一部分所占的百分比。这对我来说似乎有点奇怪,因为我对特定查询的绝对优点感兴趣,而不是它相对于碰巧出现在它旁边的其他查询的优点。

但后来我想,好吧,也许你期望做的是并排放置两个替代查询,将它们作为“一批”运行,然后成本低于 50% 的那个就是赢家。

但微软 SQL 70-433 培训工具包的第 6 章第一课中对查询成本的讨论似乎与此无关。

这是一个示例:它们显示一个包含两个相关子查询的查询,然后通过用 OUTER APPLY 替换子查询来改进它。结果:“这个查询的成本大约是 76,而第一个查询的成本是它的两倍,大约 151。” 然后他们进一步改进了查询,并将成本从 76 降低到 3.6。它们并不暗示这些数字是百分比,而是暗示它们是与作为独立对象的查询相关的绝对数字,而不参考任何其他查询。无论如何,第一个查询的成本怎么会是 151%?

在本章的后面,他们展示了一个执行计划的屏幕截图,它包含三个部分。第一个说“成本:0%”,第二个说“成本:1%”,最后一个说“成本:99%”但是截图下面的文字(书本身)“这个查询的成本是0.56” . 我猜他们意味着其他类型的成本,但我在其他地方找不到它的参考。

有人可以帮忙吗?我彻底糊涂了。

sql-server ssms

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

SQL Server 中的 SLEEP_TASK 等待类型 - 它表示什么?

我以前没有见过SLEEP_TASK等待类型,今天我似乎得到了很多。

我不是正式的 DBA,只是一名了解 DBA 知识的 SQL Server 开发人员。我们上周末将服务器升级到10.52.2500.0- 我认为是 R2SP1。

我在网上能找到的所有信息都表明SLEEP_TASK服务器正在等待某种内部进程完成。我没有任何阻塞或任何后台进程,如检查点或幽灵清理运行,所以我有点难住。

有没有人以前见过这种等待类型,如果有,你能告诉我是什么原因造成的吗?

sql-server sql-server-2008-r2 wait-types

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

索引中包含列的硬性和快速规则

是否有任何硬性规则来决定应该将哪些列以及应该以何种顺序放置在 Included in non-clustered index 中。我刚刚读了这篇文章/sf/ask/91559331/ 我发现以下查询:

SELECT EmployeeID, DepartmentID, LastName
FROM Employee
WHERE DepartmentID = 5
Run Code Online (Sandbox Code Playgroud)

海报建议制作这样的索引:

CREATE NONCLUSTERED INDEX NC_EmpDep 
  ON Employee(EmployeeID, DepartmentID)
  INCLUDE (Lastname)
Run Code Online (Sandbox Code Playgroud)

我的问题来了,为什么我们不能像这样制作索引

CREATE NONCLUSTERED INDEX NC_EmpDep 
      ON Employee( EmployeeID, DepartmentID, LastName)
Run Code Online (Sandbox Code Playgroud)

或者

    CREATE NONCLUSTERED INDEX NC_EmpDep 
          ON Employee( EmployeeID, LastName)
INCLUDE (DepartmentID)
Run Code Online (Sandbox Code Playgroud)

以及是什么导致发布者决定保留姓氏列。为什么不是其他列?以及如何决定我们应该以什么顺序保留列?

index sql-server-2005 sql-server-2008 sql-server

38
推荐指数
3
解决办法
4万
查看次数

表定义中的列顺序重要吗?

定义表时,按目的对逻辑组中的列和组本身进行排序会很有帮助。表中列的逻辑顺序向开发人员传达了意义,是良好风格的元素。

这是清楚的。

然而,不清楚的是,表中列的逻辑顺序是否对其在存储层的物理顺序有任何影响,或者是否有任何其他人可能关心的影响。

除了对样式的影响之外,列顺序是否重要?

Stack Overflow 上有一个关于这个的问题,但它缺乏权威的答案。

sql-server-2008 database-design sql-server database-internals

38
推荐指数
3
解决办法
2万
查看次数

使用 XML 阅读器优化计划

从这里执行查询以从默认扩展事件会话中提取死锁事件

SELECT CAST (
    REPLACE (
        REPLACE (
            XEventData.XEvent.value ('(data/value)[1]', 'varchar(max)'),
            '<victim-list>', '<deadlock><victim-list>'),
        '<process-list>', '</victim-list><process-list>')
    AS XML) AS DeadlockGraph
FROM (SELECT CAST (target_data AS XML) AS TargetData
    FROM sys.dm_xe_session_targets st
    JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address
    WHERE [name] = 'system_health') AS Data
CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent)
    WHERE XEventData.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report';
Run Code Online (Sandbox Code Playgroud)

在我的机器上完成大约需要 20 分钟。报告的统计数据是

Table 'Worktable'. Scan count 0, logical reads 68121, physical reads 0, read-ahead reads 0, 
         lob logical reads 25674576, lob …
Run Code Online (Sandbox Code Playgroud)

xml sql-server execution-plan database-internals sql-server-2012

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

GO 在每个 T-SQL 语句之后

在每个 SQL 语句之后使用 GO 语句的原因是什么?我知道 GO 表示批处理结束和/或允许声明的声誉,但是在每个声明之后使用它有什么好处。

我只是很好奇,因为很多 Microsoft 文档等都在每次声明后开始使用它,或者我才刚刚开始注意到。

还有什么被认为是最佳实践?

performance sql-server best-practices t-sql

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

如何使用单个查询插入或更新?

我有一个表测试,其中包含主键和自动递增的列 id 和名称。当且仅当没有记录时,我想插入一条新记录。例如

输入是 id=30122 和 name =john

如果有 ID 为 30122 的记录,那么我将 name 列更新为 john,如果没有记录,那么我将插入一条新记录。

我可以使用 2 个查询,例如

select * from test where id=30122
Run Code Online (Sandbox Code Playgroud)

如果它有一些记录,那么我可以使用 update test set name='john' where id=3012

或者如果它没有记录,那么我可以使用

insert into test(name) values('john')
Run Code Online (Sandbox Code Playgroud)

但我想使用单个查询?

有人可以告诉它是否可能吗?

sql-server merge upsert

38
推荐指数
2
解决办法
27万
查看次数

如何跟踪数据库依赖项?

随着内部应用程序经过多年的发展,您偶尔会发现有许多人们认为不再相关并想要剔除的表。在 SQL 环境中识别数据库依赖项的实用方法是什么?

我工作过的地方采取了相当残酷的选择,例如:

  • 先删除,稍后提问(如果尝试提取不再存在的表,可能会终止数据仓库构建)
  • 首先删除权限,然后等待报告错误(如果未正确处理失败,可能会导致静默错误)

我很欣赏 SQL Server 带有用于跟踪该实例中的依赖项的工具,但是如果您在不同的实例上拥有数据库,这些工具似乎很困难。是否有可以更轻松地查询依赖项的选项,也许可以回答诸如“此列在哪里使用?”之类的问题。答案是“在此存储过程中的另一台服务器上结束”或“在此 SSIS 包中结束”?

sql-server management

37
推荐指数
3
解决办法
8492
查看次数

为什么 UNIQUE 约束只允许一个 NULL?

从技术上讲,NULL = NULL 是 False,根据该逻辑,没有 NULL 等于任何 NULL,并且所有 NULL 都是不同的。这不应该意味着所有 NULL 都是唯一的并且唯一索引应该允许任意数量的 NULL 吗?

null database-design sql-server constraint unique-constraint

37
推荐指数
2
解决办法
5万
查看次数