带有OR的SQL语句永远不会执行,冻结SQL数据库

时间:2014-06-12 12:49:27

标签: sql-server performance

我有一个SQL语句

SELECT dbo.sem_computer.COMPUTER_NAME,dbo.sem_computer.COMPUTER_ID,
[IP_ADDR1_TEXT],dbo.sem_computer.COMPUTER_DOMAIN_NAME, [ID],dbo.SEM_AGENT.AGENT_VERSION
FROM sem_computer, [dbo].[V_SEM_COMPUTER], IDENTITY_MAP, SEM_CLIENT,dbo.SEM_AGENT
WHERE [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID and dbo.IDENTITY_MAP.ID = dbo.SEM_CLIENT.GROUP_ID
and dbo.SEM_COMPUTER.COMPUTER_ID = dbo.SEM_CLIENT.COMPUTER_ID
AND dbo.SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
AND NAME = 'My Company\Default Group'
OR NAME = 'My Company\Bronx'
order by [IP_ADDR1_TEXT]

当我尝试复制并粘贴此代码时,无限期执行甚至冻结了SQL服务器。

如果我删除

OR NAME = 'My Company\Bronx'

然后SQL语句执行得很好

我们正在使用SQL Server 2008

谢谢

2 个答案:

答案 0 :(得分:2)

如果您编写符合ANSI标准的T-SQL,我认为整个问题会变得更加清晰。因此,您不必在WHERE子句中使用您的连接条件,而是具有以下内容:

SELECT 
    dbo.sem_computer.COMPUTER_NAME
,   dbo.sem_computer.COMPUTER_ID
,   [IP_ADDR1_TEXT]
,   dbo.sem_computer.COMPUTER_DOMAIN_NAME
,   [ID]
,   dbo.SEM_AGENT.AGENT_VERSION
FROM
sem_computer AS COM
INNER JOIN
[dbo].[V_SEM_COMPUTER] AS V
ON
COM.COMPUTER_ID = V.COMPUTER_ID
INNER JOIN
dbo.SEM_CLIENT AS CLI
ON
COM.COMPUTER_ID = CLI.COMPUTER_ID
INNER JOIN
dbo.SEM_AGENT AS AGT
ON
COM.COMPUTER_ID = AGT.COMPUTER_ID
INNER JOIN
IDENTITY_MAP AS IM
ON
CLI.GROUP_ID = IM.ID

...

然后你的WHERE子句执行它的设计目的,即过滤你的数据。如前所述,这就变成了

WHERE
NAME IN('My Company\Default Group','My Company\Bronx')

正如所指出的,您遇到的性能问题是您获得了所有表的交叉连接。但是,如果你以符合ANSI的方式编写联接,我想你会注意到这一点。

我希望有所帮助。

答案 1 :(得分:1)

  

OR NAME IN('我的公司\默认组','我的公司\布朗克斯')

应该工作。

当您拥有AND NAME ='我的公司\默认组'时 OR NAME ='我的公司\布朗克斯'不在括号中或使用IN子句,这意味着它将获得满足OR条件的所有内容,忽略所有其他条件。