使用其CREATED_DATE列和USER_TYPE列查询具有5000万行的表的建议索引

时间:2019-06-22 17:43:35

标签: sql sql-server indexing

用户

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子句进行优化的最佳起点是什么?

3 个答案:

答案 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将建议一个索引。