Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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_Performance_Indexing - Fatal编程技术网

Sql server 什么时候数据库表变得足够大以至于索引是有益的?

Sql server 什么时候数据库表变得足够大以至于索引是有益的?,sql-server,performance,indexing,Sql Server,Performance,Indexing,假设,在SQL Server数据库中,如果我有一个包含两个int字段(比如多对多关系)的表,该表参与了两个其他表之间的联接,那么当两个int字段上的索引的性能优势克服了所述索引带来的开销时,该表的大小是否足够大 不同版本的SQL Server之间的体系结构是否存在差异,这将极大地改变这个答案?我相信,只要您开始对这些int字段进行连接,您的表就足够大了。如果表太小,无法从索引中获益,那么开销就不会太大,您可能会选择退出 当我考虑索引时的开销时,我通常会考虑表索引会经常变化——通过对索引列的插入、

假设,在SQL Server数据库中,如果我有一个包含两个int字段(比如多对多关系)的表,该表参与了两个其他表之间的联接,那么当两个int字段上的索引的性能优势克服了所述索引带来的开销时,该表的大小是否足够大


不同版本的SQL Server之间的体系结构是否存在差异,这将极大地改变这个答案?

我相信,只要您开始对这些int字段进行连接,您的表就足够大了。如果表太小,无法从索引中获益,那么开销就不会太大,您可能会选择退出


当我考虑索引时的开销时,我通常会考虑表索引会经常变化——通过对索引列的插入、删除和更新。

< P>索引将几乎总是增加查询的性能,以额外的内存和插入/删除的性能代价为代价。(因为它需要在那个时候维护索引)。分析将是唯一确定的方法来判断索引(在您的特定情况下)是否有益


通常,在创建索引时,您是在用内存换取速度(而不是额外的插入成本)。如果您要执行许多查询(选择或更新)相对于插入/删除的行数,索引通常会提高性能。

这取决于数据的选择性,如果数据选择性不够,则甚至可能不会使用索引,因为成本太高。如果表中只有2个值,且这些值分布均匀,则ed那么你会得到扫描而不是搜索


我仍然相信每个表都应该有一个主键,如果你有主键,那么你也已经有了一个索引

在索引的好处出现很久之前,插入的代价可以忽略不计。优化器足够聪明,可以忽略索引,直到单击该点为止。因此,只需从一开始就为表编制索引

另一件需要考虑的事情是编码性能的概念——有时索引可以简化思考如何管理不同数据段之间关系的思维开销。有时它会使它复杂化…

对于涉及表行小部分的查询,索引总是有益的,是吗有
100行
1000000行

有关计划和绩效详细信息的示例,请参见我博客中的这篇文章:

这些查询如下:

SELECT  *
FROM    table1 t1
JOIN    table2 t2
ON      t2.col = t1.col
SELECT  t2.col
FROM    table1 t1
JOIN    table2 t2
ON      t2.col = t1.col
将很可能使用
哈希联接
。将为较小的表构建哈希表,并使用较大表中的行来探测哈希表

为此,不需要索引

但是,此查询:

SELECT  *
FROM    table1 t1
JOIN    table2 t2
ON      t2.col = t1.col
WHERE   t1.othercol = @value
将使用
嵌套循环
:将使用
表1上的索引搜索外部表(
表1
)中的行。其他col
,并使用
表2.col
上的索引搜索内部表(
表2
)中的行

如果在
col1
上没有索引,则将使用
哈希联接
,这需要扫描两个表中的所有行和一些其他资源来构建哈希表

索引对于以下查询也很有用:

SELECT  *
FROM    table1 t1
JOIN    table2 t2
ON      t2.col = t1.col
SELECT  t2.col
FROM    table1 t1
JOIN    table2 t2
ON      t2.col = t1.col
,在这种情况下,引擎根本不需要读取
表2
本身:此查询所需的所有内容都可以在索引中找到,索引可以比表本身小得多,读取效率更高

当然,如果您需要对数据进行排序,并且在
table1.col
table2.col
上都有索引,那么下面的查询:

SELECT  *
FROM    table1 t1
JOIN    table2 t2
ON      t2.col = t1.col
ORDER BY
        t2.col
可能会使用
MERGE JOIN
方法,如果两个输入行集都已排序,并且其输出也已排序,则该方法会非常快,这意味着
ORDER BY
是免费的

请注意,即使您没有索引,优化器也可以选择
Eager Spool
您的小表,这意味着在查询期间构建临时索引,并在查询完成后删除索引

如果查询很小,那么它会非常快,但是同样,索引不会有任何影响(对于
SELECT
查询,我的意思是)。如果优化器不需要它,它就不会被使用


但是请注意,创建索引可能会影响DML的性能,但这是另一回事。

无论大小,在执行查找时使用索引都会带来性能方面的好处

关于开销,问题变成了:你指的是什么开销,以及如何将它与查找的值联系起来?毕竟,这两个值是不同的

索引有两种形式的开销:空间(根据索引的结构,空间通常可以忽略不计)和插入时重新索引(服务器必须在每次插入后重新计算索引)

正如我提到的,空间问题可能没什么大不了的。但是重新索引是。幸运的是,在这种形式的开销成为问题之前,您需要进行大量近乎连续的插入

所以,底线是:拥有索引几乎总是更好的。从这个位置开始,等到重新索引成为瓶颈。然后你可以寻找替代方案。

一个非常有用的链接: “引爆点问题答案”

最好的办法是让服务器自己去弄清楚。你可以在有意义的列中创建索引(如果没有关于如何以最佳方式实现这一点的书籍,我肯定会有完整的章节),并让SQL server弄清楚何时/如何使用索引

在许多情况下,在优化时,您需要阅读特定DBMS的文档,以了解它如何使用索引,并将其与您正在优化的应用程序使用的查询相关联