如果我在查询中包含第二个非索引列,SELECT会变慢吗?

时间:2017-04-21 07:50:12

标签: sql-server database database-performance

假设我有下表:

测试:

ID | Name | Ver | Col3| Col4 | ... 
01 | ABC  |   2 | xxx | yyy  | ...
02 | DEF  |   8 | xxx | yyy  | ...
03 | DEF  |   8 | xxx | yyy  | ...
...

ID列是主键唯一键聚集索引 Ver列没什么特别的

到目前为止,我通过以下方式进行 SELECT 查询:

SELECT (NAME, Col1, Col2) WHERE ID = '01'

下一个版本将以下列方式包含 SELECT 查询:

SELECT (NAME, Col1, Col2) WHERE ID = '01' AND Ver = '8'

为什么呢?因为我打算将此查询包含在系统中的 UPDATE DELETE 查询中,这样可以确保不存在并发编辑冲突,因为它只能更新在IDVer匹配的情况下,如果实体在此期间发生更改, SELECT 部分将保护实体免于更新,因为它不会返回任何内容。 (无需更新或删除)

问题

此更改是否会影响我的数据库性能,或者它不会打扰查询中的Ver列,因为select中的一列是唯一主键

如果它会影响记录检索的效果,我应该将VerID一起包含在聚集索引中吗? Ver应该是第二个索引吗?

欢迎提供事实和意见。

1 个答案:

答案 0 :(得分:1)

您需要尝试并查看查询计划以确保但我的感觉是:

Ver不需要在索引中。当SQL Server生成计划时,它足够聪明,可以看到该ID是唯一的。因此,它将使用ID = '1'获取记录,然后按Ver = '8'过滤该单条记录。由于这部分只对零或一条记录起作用,因此它不需要索引。