Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 server 数据库索引:仅选择!_Sql Server_Database_Indexing_Sql Server 2000 - Fatal编程技术网

Sql server 数据库索引:仅选择!

Sql server 数据库索引:仅选择!,sql-server,database,indexing,sql-server-2000,Sql Server,Database,Indexing,Sql Server 2000,你好 我有大约4GB的数据,分为10个不同的表。每个表都有许多列,每一列都可以是查询中的搜索条件。我根本不是DBA,对索引也不太了解,但我希望尽可能加快搜索速度。重要的一点是,表每4个月填充一次,在任何时候都不会有任何更新、插入或删除。在每一列上创建索引是否合适?记住:不插入、更新或删除,只选择! 另外,如果我可以使所有这些列都成为整数而不是varchar,我会在速度上有所不同吗 多谢各位 您是否查看了运行将根据工作负载为您提供索引建议。您是否查看了运行将根据工作负载为您提供索引建议。缺少两条信

你好

我有大约4GB的数据,分为10个不同的表。每个表都有许多列,每一列都可以是查询中的搜索条件。我根本不是DBA,对索引也不太了解,但我希望尽可能加快搜索速度。重要的一点是,表每4个月填充一次,在任何时候都不会有任何更新、插入或删除。在每一列上创建索引是否合适?记住:不插入、更新或删除,只选择! 另外,如果我可以使所有这些列都成为整数而不是varchar,我会在速度上有所不同吗


多谢各位

您是否查看了运行将根据工作负载为您提供索引建议。

您是否查看了运行将根据工作负载为您提供索引建议。

缺少两条信息:每列中有多少不同的值,以及您正在使用的DBMS。如果您使用的是Oracle,并且每列的不同值少于几千个,则可以创建位图索引。对于精确匹配,这些方法非常节省空间和执行效率

否则,这是一个折衷方案:每个索引将添加与包含相同数据的一个列名大致相同的空间量,因此您的空间需求将增加一倍,可能是2.5倍。所以可能是10G,这不是很多数据

还有一个问题是,您的DBMS是否能够有效地合并多个基于索引的选择。很可能不会,除非您对所选择的每一列进行自联接


最佳答案:在一个较小的数据集上尝试它,这样您就不会花费所有的时间构建索引并查看它是如何工作的。

缺少两条信息:每列中有多少不同的值,以及您正在使用的DBMS。如果您使用的是Oracle,并且每列的不同值少于几千个,则可以创建位图索引。对于精确匹配,这些方法非常节省空间和执行效率

否则,这是一个折衷方案:每个索引将添加与包含相同数据的一个列名大致相同的空间量,因此您的空间需求将增加一倍,可能是2.5倍。所以可能是10G,这不是很多数据

还有一个问题是,您的DBMS是否能够有效地合并多个基于索引的选择。很可能不会,除非您对所选择的每一列进行自联接


最佳答案:在较小的数据集上尝试它,这样你就不会花费所有的时间来构建索引并查看它是如何工作的。

答案:不。单独为每一列编制索引不是一个好的设计。索引在许多情况下需要包含多个列,并且针对不同的需求有不同类型的索引

其他答案中提到的调整向导是一个很好的第一步,特别是对于学习者来说


不要试图猜测你的方式通过它,或希望你理解复杂的分析-得到建议具体到你的情况。我们这里似乎有几个线程对于特定情况和查询优化非常活跃。

回答:没有。单独为每一列编制索引不是一个好的设计。索引在许多情况下需要包含多个列,并且针对不同的需求有不同类型的索引

其他答案中提到的调整向导是一个很好的第一步,特别是对于学习者来说

不要试图猜测你的方式通过它,或希望你理解复杂的分析-得到建议具体到你的情况。我们这里似乎有几个线程对于特定情况和查询优化非常活跃。

绝对不是

您必须了解索引是如何工作的。如果你有一个包含1000条记录的表,但它有点小,并且可以有两个值中的一个,如果你只对该列和该列进行索引,它将毫无价值,因为它的选择性不够。当您在列上建立索引时,要非常清楚将在表上执行哪些类型的选择。在列上创建索引时,该索引的选择性是否足以让优化器有效使用

在这一点上,您很可能会发现,一些精心挑选的复合索引将大大优于每列上许多单个索引的解决方案。黄金法则:数据库的查询方式将决定您应该如何编制索引。

绝对不是

您必须了解索引是如何工作的。如果你有一个包含1000条记录的表,但它有点小,并且可以有两个值中的一个,如果你只对该列和该列进行索引,它将毫无价值,因为它的选择性不够。当您在列上建立索引时,要非常清楚将在表上执行哪些类型的选择。在列上创建索引时,该索引的选择性是否足以让优化器有效使用?


在这一点上,您很可能会发现,一些精心挑选的复合索引将大大优于每列上许多单个索引的解决方案。黄金法则:数据库的查询方式将决定您应该如何创建索引。

如果您从表中选择的列数大于所选索引中的列数,那么您将不可避免地在查询计划中进行书签查找,在这里,查询处理器必须使用关联非聚集索引中叶行的引用ID从聚集索引中检索非覆盖列

根据我的经验,书签查找确实会降低查询性能,这是因为需要大量的额外读取,而且聚集索引中的每一行都必须单独解析。这就是为什么我尝试使NC索引覆盖所有可能的地方,这在已知所需查询计划的较小表上更容易实现,但是如果您有包含大量列的大型表,并且需要使用任意查询,那么这可能是不可行的

这意味着,如果索引覆盖了任何类型的NC索引,或者选择了一个足够小的数据集以降低书签查找的成本,那么您只需使用NC索引即可获得丰厚的回报。事实上,您可能会发现,如果与聚集索引扫描相比成本过高,查询优化器甚至不会查看您的索引,其中所有列都已可用

因此,除非您知道索引将优化给定查询的结果,否则创建索引没有任何意义。因此,索引的值与它可以为给定表优化的查询的百分比成正比,这只能通过分析正在执行的查询来确定,这正是索引优化向导为您所做的

总而言之:

1不要为每一列编制索引。这是典型的过早优化。您不能提前为所有可能的查询计划优化带有索引的大型表


2在通过索引调整向导捕获并运行基本工作负载之前,不要为任何列编制索引。此工作负载需要代表应用程序的使用模式,以便向导可以确定哪些索引实际有助于查询的性能。

如果您从表中选择的一组列大于所选索引中的列所覆盖的列,然后,您将不可避免地在查询计划中进行书签查找,在查询计划中,查询处理器必须使用引用ID从关联的非聚集索引中的叶行中检索聚集索引中的非覆盖列

根据我的经验,书签查找确实会降低查询性能,这是因为需要大量的额外读取,而且聚集索引中的每一行都必须单独解析。这就是为什么我尝试使NC索引覆盖所有可能的地方,这在已知所需查询计划的较小表上更容易实现,但是如果您有包含大量列的大型表,并且需要使用任意查询,那么这可能是不可行的

这意味着,如果索引覆盖了任何类型的NC索引,或者选择了一个足够小的数据集以降低书签查找的成本,那么您只需使用NC索引即可获得丰厚的回报。事实上,您可能会发现,如果与聚集索引扫描相比成本过高,查询优化器甚至不会查看您的索引,其中所有列都已可用

因此,除非您知道索引将优化给定查询的结果,否则创建索引没有任何意义。因此,索引的值与它可以为给定表优化的查询的百分比成正比,这只能通过分析正在执行的查询来确定,这正是索引优化向导为您所做的

总而言之:

1不要为每一列编制索引。这是典型的过早优化。您不能提前为所有可能的查询计划优化带有索引的大型表


2在通过索引调整向导捕获并运行基本工作负载之前,不要为任何列编制索引。此工作负载需要代表应用程序的使用模式,以便向导可以确定哪些索引实际上有助于查询的性能。

此外,不要忘记,如果有许多列,优化器将需要更长的时间来确定哪些索引有帮助,哪些索引没有帮助。许多(可能是大多数)列不需要索引;只有那些在过滤条件下被积极使用的数据库才能使您受益。@Jon,这就是为什么像DB2:-这样的真实数据库具有runstats等,这样它们可以使优化器了解表中的数据分布情况。优化器可以很容易地选择最好的索引,不管有多少。@doofle,问题指出,每一列都要进行搜索-因此,为了获得最大的速度,它们应该都是
被索引,以及可能在多个列组上的索引。@Pax,他在询问每列上的单个字段索引。如果一列是复合索引中的第一列,那么它不需要自己的另一个索引。此外,例如,布尔字段索引被忽略,因此对于这些情况,一揽子规则太幼稚了。@doofle,阅读问题-没有位字段,每一列都要进行搜索。另外,不要忘记,如果有许多列,优化器将花费更长的时间来确定哪些索引有用,哪些不有用。许多(可能是大多数)列不需要索引;只有那些在过滤条件下被积极使用的数据库才能使您受益。@Jon,这就是为什么像DB2:-这样的真实数据库具有runstats等,这样它们可以使优化器了解表中的数据分布情况。优化器可以很容易地选择最好的索引,不管有多少。@doofle,这个问题说明每一列都要进行搜索-因此,为了获得最大的搜索速度,它们都应该被索引,可能还有多个列组的索引。@Pax,他问的是每一列上的一个字段索引。如果一列是复合索引中的第一列,那么它不需要自己的另一个索引。此外,例如,布尔字段索引被忽略,因此对于这些情况,一揽子规则太幼稚了。@doofle,请阅读问题-没有位字段,每一列都要进行搜索。@Dave,问题是针对varchars的,每一列都是可搜索的,因此,您的回答对于索引方面的一般问题很好,这不适用于这个问题。你的黄金法则是正确的,但你总是拥有做出决定所需的信息。仅仅因为列中有VARCHARs,并不意味着索引是选择性的!BIT示例只是用来说明一些显然无法选择性的东西。如果您的VARCHAR列每1000行只有2或3个值,情况也是如此…@Dave,问题是针对VARCHAR的,并且每个列都是可搜索的,因此,虽然您的回答适用于有关索引的一般问题,但实际上并不适用于此问题。你的黄金法则是正确的,但你总是拥有做出决定所需的信息。仅仅因为列中有VARCHARs,并不意味着索引是选择性的!BIT示例只是用来说明一些显然无法选择性的东西。如果您的VARCHAR列每1000行只有2或3个值,情况也是如此…@kiwibuster,可能是新西兰的任何人,Oz的您好:-,回答得好,+1。向导是动态地进行统计以使优化器保持最新状态,还是仅仅建议将新的DDL命令应用于表?DB2有runstats,它可以根据表中的数据更改计划路径。@Kiwibuster,可能是新西兰的任何人,Oz的您好:-,回答得好,+1。向导是动态地进行统计以使优化器保持最新状态,还是仅仅建议将新的DDL命令应用于表?DB2有runstats,它根据表中的数据更改计划路径。