表用户:
ID PK INT
USER_TYPE VARCHAR(50) NOT NULL
CREATED_DATE DATETIME2(7) NOT NULL
我的这张表有5000万行,它是使用以下where子句进行的查询:
WHERE
u.USER_TYPE= 'manager'
AND u.CREATED_DATE >= @StartDate
AND u.CREATED_DATE < @EndDate
此表上的索引针对上述查询where子句进行优化的最佳起点是什么?
答案 0 :(得分:2)
对于该查询,所需的索引是具有两列的复合索引:(user_type, created_date)
。顺序很重要,由于相等比较,您首先要user_type
。
答案 1 :(得分:0)
通过创建一个具有任意INT ID的用户类型的表并通过ID引用管理器类型,而不是直接在users表中使用管理器类型,您将得到很好的服务。这将缩小表数据以及所有引用用户类型的索引。
CREATE TABLE user_type (
id INT NOT NULL IDENTITY(1,1),
description NVARCHAR(128) NOT NULL,
CONSTRAINT pk_user_type PRIMARY KEY CLUSTERED(id)
);
CREATE TABLE users (
id INT NOT NULL IDENTITY(1,1),
user_type_id INT NOT NULL,
created_date DATETIME2(7) NOT NULL,
CONSTRAINT pk_users PRIMARY KEY CLUSTERED(id),
CONSTRAINT fk_users_user_type FOREIGN KEY(user_type_id) REFERENCES user_type(id)
);
CREATE NONCLUSTERED INDEX
ix_users_type_created
ON
users (
user_type_id,
created_date
);
您将使用user_type
ID进行查询,而不是直接使用文本。
答案 2 :(得分:0)
用于任何查询。启用“包含实际执行计划”的SSMS中运行查询。如果认为适当的索引不存在,SSMS将建议一个索引。