Alias如何提高性能

时间:2019-03-14 13:02:19

标签: sql sql-server

我正在研究SQL Server中的Select代码,并且很难理解为什么我们必须在此处的Where条件中使用别名:

AND NOT EXISTS (
                    (SELECT 1
                        FROM ComprasPedidosItens CPI WITH (NOLOCK)
                        WHERE CPI.NumeroMiro IS NOT NULL AND  CPI.CodigoPedido = ComprasPedidos.CodigoPedido)
                    )

谢谢

3 个答案:

答案 0 :(得分:0)

据我所知,Alias对查询执行的性能没有任何影响。但是,如果在选择列表中使用别名,则根据查询可能会降低性能。

答案 1 :(得分:0)

别名不会提高性能。但是,当在查询中两次(或多次)使用同一表(带有子查询,联接等)时,这有助于使他与众不同。

在示例中,让我们考虑该表,它具有一个引用同一表的外键:

MyTable:

Self-reference
 +--------+
 |        |
 v        |
id | MyTable_id | data

这个查询:

SELECT *
FROM MyTable
LEFT JOIN MyTable
ON MyTable.id = MyTable.MyTable_id
--     ^           ^
--     |           |
-- Which table ? Which table ?
-- The first ?   The first ?
--     Or           Or
-- the second ? the second ?

使用别名很有意义

SELECT *
FROM MyTable T1
LEFT JOIN MyTable T2
ON T1.id = T2.MyTable_id
-- Now we know.

答案 2 :(得分:0)

如果您要询问CPI别名,那么不是是必需的。

NOT EXISTS (
            (SELECT 1
                FROM ComprasPedidosItens CPI WITH (NOLOCK)
                WHERE CPI.NumeroMiro IS NOT NULL AND  CPI.CodigoPedido = ComprasPedidos.CodigoPedido)
            )

相同
NOT EXISTS (
            (SELECT 1
                FROM ComprasPedidosItens WITH (NOLOCK)
                WHERE NumeroMiro IS NOT NULL AND  CodigoPedido = ComprasPedidos.CodigoPedido)
            )

列将根据范围中最合适的项目进行解析,因为这是该范围级别中引入的唯一表,因此默认情况下会首先尝试(使用不匹配的不合格列,然后再对来自外部范围的对象进行尝试)

但是使用两部分的列名会更清晰,因此读者可以轻松分辨出它们来自哪个表,而简短的助记符别名比整个表名更易于遵循。

别名对性能没有影响。