相关疑难解决方法(0)

即使第一个参数不为 NULL,SQL Server 是否会读取所有 COALESCE 函数?

我正在使用 T-SQLCOALESCE函数,其中第一个参数在大约 95% 的运行时间不会为空。如果第一个参数是NULL,第二个参数是一个相当漫长的过程:

SELECT COALESCE(c.FirstName
                ,(SELECT TOP 1 b.FirstName
                  FROM TableA a 
                  JOIN TableB b ON .....)
                )
Run Code Online (Sandbox Code Playgroud)

例如,如果 ,c.FirstName = 'John'SQL Server 仍会运行子查询吗?

我知道使用 VB.NETIIF()函数,如果第二个参数为 True,代码仍会读取第三个参数(即使不会使用它)。

null sql-server coalesce

102
推荐指数
6
解决办法
2万
查看次数

为什么以不允许在大多数子句中使用列别名的方式解析查询?

在尝试编写查询时,我发现(困难的方法)SQL Server 在执行查询时解析 SELECT 之前很久就解析了查询中的 WHERE。

MSDN文档说,一般逻辑解析顺序是这样的:SELECT被解析几乎最后(因此导致“没有这样的对象[别名]”试图使用在其他条款列别名时误差)。甚至有人建议允许在任何地方使用别名,但被微软团队驳回,理由是 ANSI 标准合规性问题(这表明这种行为是 ANSI 标准的一部分)。

作为一名程序员(不是 DBA),我发现这种行为有些令人困惑,因为在我看来它在很大程度上违背了拥有列别名的目的(或者,至少,如果列别名是在查询执行中更早地解析),因为您可以实际使用别名的唯一地方是在 ORDER BY 中。作为一名程序员,它似乎错过了使查询更强大、更方便和 DRY 的巨大机会。

看起来这是一个如此明显的问题,它有理由认为,除了 SELECT 和 ORDER BY 之外,还有其他原因决定不允许列别名,但这些原因是什么?

sql-server alias

16
推荐指数
2
解决办法
3293
查看次数

WHERE 查询会在运行更艰巨的比较(即 varchar)之前检查更简单的比较(即位)吗?

如果我编写一个包含复合WHERE子句的查询,例如:

SELECT *
FROM MyTable
WHERE BitField = 1
    AND VarcharField = 'asdf'
Run Code Online (Sandbox Code Playgroud)

并且包含该bit比较只是排除了varchar比较将排除的相同字段,该bit字段比较的存在是否会使我的性能有所提高?

sql-server optimization

12
推荐指数
2
解决办法
966
查看次数

如果其他 where 子句返回足够多的结果,SQL Server 能否避免子查询或连接?

以这个为例:

SELECT TOP 1 FROM customers
WHERE firstname LIKE 'John%'
   OR id IN (SELECT id_customer 
             FROM customer_emails 
             WHERE email like 'john.doe@%' )
Run Code Online (Sandbox Code Playgroud)

查询优化器是否设法优先处理第一个子句,如果更简单的子句对于至少 1 条记录(使用 Top 1)为真,则避免执行子查询?

我问这个主要是因为上面的查询可以重写为 Join,根据Join vs. sub-query从技术上讲,它会更快。但是,如果避免使用子查询,则在第一个子句可能为真的情况下,上面的示例显然优于 Join 。

sql-server optimization

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

如果第一个条件失败,SQL 会检查每个 And 条件吗?

对于以下类型的查询,And如果第一个And条件失败,sql是否会为每个条件处理数据?如果某行的 Emp_ID 不是 12,那么它会检查 Emp_Name 的条件吗?那么SQL是如何处理这种查询的呢?

SELECT [Emp_ID],[Emp_Name],[Emp_Sal] FROM [gyh].[dbo].[Employee_Demo] where Emp_ID='12' And Emp_Name like '%ab%'
Run Code Online (Sandbox Code Playgroud)

performance sql-server execution-plan sql-server-2008-r2 query-performance

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

WHERE 子句中的短路

如何在 where 子句中短路,例如:

select 1 where 1=2 AND 1/0=0
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,1/0=0不应评估条件,因为第一个条件为假。

sql-server

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