sql中非索引列的where子句

时间:2015-04-08 08:51:16

标签: sql sql-server

我有一个员工表,其中id是其主键。它包含五十万甚至更多行,并且只有不到十名被解雇的员工。查找它们的最佳方法是什么?

SELECT id, name, mode
  FROM employees
  WHERE mode   = 'fired'

CREATE TABLE [dbo].[employee](
    [id] [int] IDENTITY(27,1) NOT NULL,
    [name] [varchar](255) NULL,
    [mode] [varchar](45) NOT NULL)

2 个答案:

答案 0 :(得分:2)

正如sidux所说,你应该在模式列上创建一个索引。

为sidux回答添加更多选项,在我看来,你应该有另一张表,其中包含有关员工状态的元数据信息,并将该表的FK作为员工的状态,替换模式列(id,name, statusId)。这将允许您创建一个较小的索引,并在按状态ID过滤(创建索引)时获得更好的性能

答案 1 :(得分:1)

您可以创建NON CLUSTERED条件索引。

 CREATE NON CLUSTERED INDEX ix_employees_firedEmployees ON employees (name) INCLUDE (mode) WHERE mode = 'fired';

但在实践中,更好的方式是有标志或状态来表明这样的员工。例如状态CHAR(1)='F'或IsFired BIT = 1