我有桌子学生如下
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')
答案 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)
执行计划是一个非常有用的工具。例如,可能会提示缺少的索引