Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Sql 如何知道何时使用索引以及索引的类型?_Sql_Performance_Database Design_Indexing - Fatal编程技术网

Sql 如何知道何时使用索引以及索引的类型?

Sql 如何知道何时使用索引以及索引的类型?,sql,performance,database-design,indexing,Sql,Performance,Database Design,Indexing,我已经搜索了一点,没有看到任何类似的问题,所以这里开始 如何知道何时在表中放置索引?如何决定索引中包含哪些列?什么时候应该使用聚集索引 索引是否会降低select语句的性能?有多少个索引太多,您需要多大的表才能从索引中获益 编辑: 列数据类型呢?在varchar或datetime上建立索引可以吗?这确实是一个非常复杂的问题,尽管一个很好的起点是对任何一列进行索引,以过滤结果。例如,如果您经常按销售价格将产品分组,请为products表的sale_price列编制索引,以缩短该查询的扫描时间,等等

我已经搜索了一点,没有看到任何类似的问题,所以这里开始

如何知道何时在表中放置索引?如何决定索引中包含哪些列?什么时候应该使用聚集索引

索引是否会降低
select
语句的性能?有多少个索引太多,您需要多大的表才能从索引中获益

编辑:


列数据类型呢?在
varchar
datetime
上建立索引可以吗?

这确实是一个非常复杂的问题,尽管一个很好的起点是对任何一列进行索引,以过滤结果。例如,如果您经常按销售价格将产品分组,请为products表的sale_price列编制索引,以缩短该查询的扫描时间,等等。

如果您是根据列中的值进行查询,则可能需要为该列编制索引

i、 e

你会想要一个X上的索引

通常,我为经常查询的列添加索引,并且在查询多个列时添加复合索引

索引不会影响SELECT的性能,但如果每个表的索引列太多,则索引可能会减慢插入(或更新)的速度


根据经验,当你发现自己在说WHERE a=123(在本例中是“a”的索引)时,首先添加索引。

你应该在用于选择和排序的列上使用索引,即WHERE和ORDER by子句

如果索引中有许多语句,并且您正在对未编制索引的列使用WHERE和ORDER BY,则索引会减慢select语句的速度

至于表的大小——数千行及以上的行将开始显示索引使用的真正好处


话虽如此,还是有一些自动化的工具可以做到这一点,SQL server有一个可以帮助做到这一点的工具。

好吧,第一个问题很简单:

什么时候应该使用聚集索引

总是。时期除了极少数罕见的边缘情况。对于每个操作,聚集索引都会使表更快。对是的。有关背景信息,请参见Kim Tripp的优秀作品。她还提到了聚集索引的主要标准:

  • 狭窄的
  • 静态(从不更改)
  • 独特的
  • 如果可能:不断增加
INT-IDENTITY完美地实现了这一点,而GUID则没有。有关详细的背景信息,请参阅

为什么缩小范围?因为聚类键被添加到同一个表中每个非聚类索引的每个索引页中(以便能够在需要时实际查找数据行)。您不希望在集群密钥中包含VARCHAR(200)

为什么唯一???请参见上文-群集键是SQL Server用于唯一查找数据行的项和机制。它必须是独一无二的。如果您选择一个非唯一的集群密钥,SQL Server本身将向您的密钥添加一个4字节的唯一化器。小心

下一步:非聚集索引。基本上有一条规则:引用另一个表的子表中的任何外键都应该被索引,这将加速连接和其他操作

此外,任何具有WHERE子句的查询都是一个很好的候选者——首先选择那些执行了很多次的查询。在WHERE子句中显示的列上按ORDER BY语句放置索引

下一步:测量您的系统,检查DMV(动态管理视图)中有关未使用或缺少索引的提示,并反复调整您的系统。这是一个持续的过程,你永远不会完成!请参见这两个DMV(缺失和未使用的索引)


另一个警告:有了一卡车索引,您可以让任何SELECT查询运行得非常快。但同时,必须更新所有相关索引的插入、更新和删除操作可能会受到影响。如果你只选择了-去发疯吧!否则,这是一个微妙的平衡行为。您总是可以对单个查询进行难以置信的调整,但这样做可能会影响系统的其他部分。不要索引过多你的数据库!将一些好的索引放在适当的位置,检查并观察系统的行为,然后可能再添加一个或两个,再次:观察总体系统性能是如何受其影响的。

经验法则是主键(隐含且默认为聚集)和每个外键列

还有很多,但可能比使用SQL Server的DMV做得更糟


如果乐观者做出了错误的选择,指数可能会减慢选择的速度,并且可能有太多的选择。太多会减慢写入速度,但也有可能重叠索引

回答我能回答的问题。我想说的是,每个表,无论多么小,都将至少受益于一个索引,因为必须至少有一种方式让您有兴趣查找数据;否则为什么要储存它

添加索引的一般规则是,如果需要使用特定字段或字段集查找表中的数据。这会导致索引数量过多,通常索引越多,插入和更新的速度就越慢,因为它们也必须修改索引,但这一切都取决于您如何使用数据。如果你需要快速插入,那么不要使用太多。在报告“只读”类型的数据存储时,您可以拥有许多数据存储,以加快所有查找

不幸的是,没有一条规则可以指导您使用索引的数量或类型,尽管所选数据库的查询优化程序可以根据您正在执行的查询给出提示

至于聚集索引,它们是您只能使用一次的王牌,因此请仔细选择。值得计算您正在考虑使用它的字段的选择性,因为如果将它放在类似布尔字段(人为示例)的字段上,可能会浪费它,因为数据的选择性非常低。

+1注意
SELECT a,b,c FROM MyTable WHERE x = 1