SQL Server - 索引和运算符优先级

时间:2014-12-17 09:53:24

标签: sql sql-server

我有桌子学生如下

Student(id,jdate)

其中列id是主键。现在我正在编写如下查询

select * from Student where id=2 and (jdate='date1' or jdate='date2') 

索引会在这里运作吗?或者我可以修改如下吗?

select * from Student where (id=2) and (jdate='date1' or jdate='date2')

4 个答案:

答案 0 :(得分:2)

您的示例都会使用PK索引作为列' id'。

如果不清楚,操作员" ="优先于"和",因此括号不是必需的。

答案 1 :(得分:2)

由于您在id列上声明了PK,因此您也在表上定义了一个唯一的聚簇索引。由于您在where子句中使用id列,因此应使用索引。

这两个查询都将使用索引和id = 2周围的括号不会改变逻辑/条件评估中的任何内容。

答案 2 :(得分:1)

是的,两个查询都有效,并且都会点击任何相关的聚簇索引或非聚簇索引。

鉴于id是您的表PK,您可能甚至不会点击jDate上的任何索引。 (即,虽然乍一看指数(id, jdate)似乎很有用,但实际上由于id是PK而且目标单id的查询将使用Clustered Index,因此它将是多余的(如果使用默认的PK群集),或PK Constraint本身(如果表具有不同的群集)。

虽然id = 2周围的假括号将被忽略,但显然and优先于or,因此围绕or的括号是必不可少的:

... and (... or ...)

答案 3 :(得分:0)

正如其他用户所说 - 两个查询都是一样的。并将使用PK索引。如果您对使用哪个索引有疑问(在此查询或其他查询中),请参阅执行计划:(http://technet.microsoft.com/en-us/library/ms178071%28v=sql.105%29.aspx

执行计划是一个非常有用的工具。例如,可能会提示缺少的索引