Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 对于表来说,这是一种糟糕的索引策略吗?_Database_Sql Server 2005_Clustered Index - Fatal编程技术网

Database 对于表来说,这是一种糟糕的索引策略吗?

Database 对于表来说,这是一种糟糕的索引策略吗?,database,sql-server-2005,clustered-index,Database,Sql Server 2005,Clustered Index,该表是供应商软件在我们网络上使用的数据库的一部分。该表包含有关文件的元数据。该表的模式如下所示 Metadata ResultID (PK, int, not null) MappedFieldname (char(50), not null) Fieldname (PK, char(50), not null) Fieldvalue (text, null) ResultID和Fieldname上有一个聚集索引。此表通常包含数百万行(在一种情况下,它包含5亿行)。当数据被“处理”时,

该表是供应商软件在我们网络上使用的数据库的一部分。该表包含有关文件的元数据。该表的模式如下所示

Metadata 
ResultID (PK, int, not null) 
MappedFieldname (char(50), not null) 
Fieldname (PK, char(50), not null) 
Fieldvalue (text, null)
ResultID和Fieldname上有一个聚集索引。此表通常包含数百万行(在一种情况下,它包含5亿行)。当数据被“处理”时,该表由24个工人填充,每个工人运行4个线程。这会导致许多非顺序插入。处理之后,我们的一些内部软件会将更多数据插入该表。给定表的碎片至少为50%。如果是最大的表,则为90%。我们没有DBA。我知道我们迫切需要DB维护策略。就我的背景而言,我是一名在这家公司兼职的大学生


我的问题是,聚集索引是最好的方法吗?是否应该考虑另一个指数?对于这种类型和类似的即席DBA任务,有什么好的参考吗?

索引策略完全取决于查询表的方式以及需要从相应查询中获得多少性能

在进行无序插入时(这称为“页面拆分”),聚集索引可以强制物理地(在磁盘上)重新排序行。在索引页上没有可用空间的大型表中,这可能需要一些时间

如果不一定要有一个跨越两个字段的聚集索引,那么就不要这样做。如果它更像是一种唯一的约束,那么一定要使它成为唯一的约束。不需要对这些进行重新排序

确定针对表的典型查询是什么,并相应地放置索引。索引越多,数据更改(插入/更新/删除)的速度就越慢。不要创建太多索引,例如在不太可能进行筛选/排序的字段上创建索引


通常,仅在一起过滤/排序的字段上创建组合索引。

索引策略完全取决于查询表的方式以及需要从各个查询中获得多少性能

在进行无序插入时(这称为“页面拆分”),聚集索引可以强制物理地(在磁盘上)重新排序行。在索引页上没有可用空间的大型表中,这可能需要一些时间

如果不一定要有一个跨越两个字段的聚集索引,那么就不要这样做。如果它更像是一种唯一的约束,那么一定要使它成为唯一的约束。不需要对这些进行重新排序

确定针对表的典型查询是什么,并相应地放置索引。索引越多,数据更改(插入/更新/删除)的速度就越慢。不要创建太多索引,例如在不太可能进行筛选/排序的字段上创建索引


通常,只在过滤/排序在一起的字段上创建组合索引。

就我看来,聚集索引是正常的。关于其他索引,您需要提供在此表上操作的典型SQL查询。只是突然创建一个索引从来都不是一个好主意。 您谈论的是分段和索引,这是否意味着您怀疑查询执行会减慢?还是只想对数据库/索引进行收缩/碎片整理


<> P>这是一个好主意,在关闭的时候有一个任务可以对索引进行定期碎片整理,尽管必须考虑到频繁/随机插入,在表中有一些空闲空间来防止页面分割(这会影响性能)不会有坏处。关于其他索引,您需要提供在此表上操作的典型SQL查询。只是突然创建一个索引从来都不是一个好主意。 您谈论的是分段和索引,这是否意味着您怀疑查询执行会减慢?还是只想对数据库/索引进行收缩/碎片整理


<> P>这是一个好主意,在关闭的时候有一个任务可以对索引进行定期碎片整理,尽管你必须考虑到频繁的/随机的插入,在表中有一些空闲空间来防止页面拆分(这会影响性能)不会有坏处。

仔细查看你的查询-那些命中数据表的查询。索引会起作用吗?如果您在(ResultID,FieldName)上有一个按该顺序排列的索引,但您正在查询给定字段名的可能ResultID值,则DBMS可能会忽略该索引。相反,如果您在(FieldName,ResultID)上有索引,它可能会使用索引-当然是用于简单的值查找(

其中FieldName='abc'
)。就唯一性而言,这两个索引都可以很好地工作;在查询优化方面,存在(至少潜在的)巨大差异

用于查看DBMS如何处理查询


在DBMS中,聚集索引与非聚集索引通常是一种二阶优化效果。如果索引正确,则聚集索引和非聚集索引之间的差别很小(对于聚集索引,更新代价更大,以补偿选择时间稍短)。在担心二阶效应之前,确保所有其他问题都得到了优化。

仔细查看您的查询——那些在表格中查找数据的查询。索引会起作用吗?如果您在(ResultID,FieldName)上有一个按该顺序排列的索引,但您正在查询给定字段名的可能ResultID值,则DBMS可能会忽略该索引。相反,如果您在(FieldName,ResultID)上有索引,它可能会使用索引-当然是用于简单的值查找(
其中FieldName='abc'
)。就唯一性而言,这两个索引都可以很好地工作;在查询优化方面,存在(至少潜在的)巨大差异

用于查看数据库如何处理查询