Sql server 如何知道在SQL Server中,我们必须对表的哪个列应用索引?

Sql server 如何知道在SQL Server中,我们必须对表的哪个列应用索引?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,假设我们有一个包含100列的表。我想在该表上应用索引,如何确定我们必须应用索引的列?首先,如果表中有这么多列,那么可能是做错了什么 但除此之外,请查看您的查询,并根据经验为查询的where和order by子句中使用的列编制索引 数据库查找或订购记录所需的所有信息都应编入索引。一般来说 比如说 select top 10 name, description from your_table where status = 1 order by date desc 对于此查询,应为两列状态和日期

假设我们有一个包含100列的表。我想在该表上应用索引,如何确定我们必须应用索引的列?

首先,如果表中有这么多列,那么可能是做错了什么

但除此之外,请查看您的查询,并根据经验为查询的
where
order by
子句中使用的列编制索引

数据库查找或订购记录所需的所有信息都应编入索引。一般来说

比如说

select top 10 name, description 
from your_table
where status = 1 
order by date desc

对于此查询,应为两列
状态
日期
编制索引。

在表上创建索引取决于要放置WHERE子句的列

一旦您能够知道要用于WHERE子句的列,您就可以在这些列上创建索引


通常,数字列是索引的最佳选择。

此查询显示应使用SQL server内部统计信息创建的缺失索引。另外,对要创建的每个索引再分析一次。每个表创建的索引不要超过5-10个

SELECT TOP 25
    dm_mid.database_id AS DatabaseID,
    dm_migs.avg_user_impact*(dm_migs.user_seeks+dm_migs.user_scans) Avg_Estimated_Impact,
    dm_migs.last_user_seek AS Last_User_Seek,
    OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) AS [TableName],
    'CREATE INDEX [IX_' + OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) + '_'
    + REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.equality_columns,''),', ','_'),'[',''),']','') 
    + CASE
    WHEN dm_mid.equality_columns IS NOT NULL
    AND dm_mid.inequality_columns IS NOT NULL THEN '_'
    ELSE ''
    END
    + REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.inequality_columns,''),', ','_'),'[',''),']','')
    + ']'
    + ' ON ' + dm_mid.statement
    + ' (' + ISNULL (dm_mid.equality_columns,'')
    + CASE WHEN dm_mid.equality_columns IS NOT NULL AND dm_mid.inequality_columns 
    IS NOT NULL THEN ',' ELSE
    '' END
    + ISNULL (dm_mid.inequality_columns, '')
    + ')'
    + ISNULL (' INCLUDE (' + dm_mid.included_columns + ')', '') AS Create_Statement
    FROM sys.dm_db_missing_index_groups dm_mig
    INNER JOIN sys.dm_db_missing_index_group_stats dm_migs
    ON dm_migs.group_handle = dm_mig.index_group_handle
    INNER JOIN sys.dm_db_missing_index_details dm_mid
    ON dm_mig.index_handle = dm_mid.index_handle
    WHERE dm_mid.database_ID = DB_ID()
    ORDER BY Avg_Estimated_Impact DESC

作者博客:

这取决于很多因素。在您的表上执行什么类型的查询?多久?数据修改的频率?如何修改数据-仅插入,或/和更新和删除?主键定义是什么?我的建议是放弃寻找简单的解决办法。你需要读很多书才能做出正确的决定。检查这篇文章,不要太快-