SQL Server哪个查询运行得更快

时间:2016-08-28 09:50:48

标签: sql sql-server

<table class="mytable mytable-body">
  <tr>
    <td width="10%" colspan="4">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
  <tr>
    <td width="10%" colspan="4">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>

  <tr>
    <td width="10%" colspan="3">Null</td>
    <td width="10%" colspan="4">Null</td>
  </tr>
  <tr>
    <td width="10%" colspan="3">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
  <tr>
    <td width="10%" colspan="3">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%" colspan="6">Null</td>
  </tr>
  <tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%" colspan="6">Null</td>
  </tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%" colspan="3">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%" colspan="4">Null</td>
  </tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
  <tr>
    <td width="40%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
    <td width="10%">Null</td>
  </tr>
</table>

这更快或

UPDATE User 
SET Name = (SELECT NameSpace.NameId 
            FROM NameSpace 
            WHERE NameSpace.Name = 'BlaBlaBla') 
WHERE UserId = 1453

int Value = Select NameSpace.NameId from NameSpace 
            where NameSpace.Name = 'BlaBlaBla';

UPDATE User 
SET Name = "+Value +" 
WHERE UserId = 1453

OR

Select 
    UserName,
    UserAge,
    (Select * from AdressesTable where Adresses.AdresID=User.AdresID) 
from 
    UserTable
where
    UserId='123'

1 个答案:

答案 0 :(得分:1)

在确定哪个更快时,需要做出各种假设。

首先,如果您关注速度,那么您需要users(userid)namespace(name)上的索引。

其次,赋值查询在SQL Server中应如下所示:

declare @Value int;

select @Value = NameSpace.NameId
from NameSpace 
where NameSpace.Name = 'BlaBlaBla';

您的变量声明和子查询对于SQL Server不正确。

最后,即使设置正确,也无法说哪个更快。如果我假设UserId只有一个匹配的记录,那么单个update可能更快 - 尽管可能这么少,以至于它不明显。它可能不会更快。更新可能会导致在NameSpace上采取某种锁定,否则将不会采取这种锁定。我实际上期望这两者的速度相当。

但是,如果许多用户具有相同的userid(这不太可能是列的名称),那么您正在对多行进行更新。将计算结果存储一次并使用它可能比多次运行子查询更好。即便如此,如果使用正确的索引,我预计性能差异可以忽略不计。