Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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
C# 只读数据库上的索引_C#_Sql_Sql Server Ce 4 - Fatal编程技术网

C# 只读数据库上的索引

C# 只读数据库上的索引,c#,sql,sql-server-ce-4,C#,Sql,Sql Server Ce 4,我不确定这里是否是回答这个问题的地方,但这里有: 我有一个只读数据库,它包含许多使用c桌面应用程序访问和搜索的表 我正在研究索引,关于索引的大多数教程和信息都集中在选择性能和插入/更新性能之间的折衷上,并引入了索引 我的问题是,对于只读数据库,在每一列和每一列组合上放置索引有什么坏处?假设我也不太关心数据库的大小 或者换一种方式说,您能为只读数据库建立索引吗?让我们考虑一下在索引表中插入/更新行时会发生什么情况假设我们使用的是标准的B树索引。条目将被添加到表本身以及在表上的每个索引中创建的条目中

我不确定这里是否是回答这个问题的地方,但这里有:

我有一个只读数据库,它包含许多使用c桌面应用程序访问和搜索的表

我正在研究索引,关于索引的大多数教程和信息都集中在选择性能和插入/更新性能之间的折衷上,并引入了索引

我的问题是,对于只读数据库,在每一列和每一列组合上放置索引有什么坏处?假设我也不太关心数据库的大小


或者换一种方式说,您能为只读数据库建立索引吗?

让我们考虑一下在索引表中插入/更新行时会发生什么情况假设我们使用的是标准的B树索引。条目将被添加到表本身以及在表上的每个索引中创建的条目中。这就是造成时间/空间开销的原因

要直接回答您的问题,不,除了生成索引的初始时间/空间开销之外,在每个表的每一列上放置索引没有什么大的缺点。请记住,在执行查询时,每个表最多只能使用一个索引。通过拥有大量的索引/复合索引,您为优化者在决定使用哪些索引时提供了最佳选择


话虽如此,但在没有考虑任何问题的情况下就开始生成任意索引是很麻烦的。如果我是你,我会看看你需要什么样的查询才能运行得更快,并开始相应地生成索引。

实际上,iirc,一个仓库特定的系统,SybaseIQ就是这样做的——将每个字段都放在自己的索引中。但是我不喜欢这个主意。我对这样一种观点极为谨慎:如果某件事在那里是个好主意,那么它在任何地方都是个好主意。我称之为Tomm-Carr通用规则,适用于所有环境、所有条件下的所有情况,简称TCUR

即:

除了汤姆卡尔 适用于所有情况下的通用规则 在所有情况下,没有一条规则适用于 在所有情况下的所有条件下的所有情况

这仅仅意味着,我们可能制定的最好的规则、标准或默认值,永远不会超过一个良好的开端

因此,如果你想设计出最好的仓库,你必须投入工作。现在,这是一个仓库,这意味着您可以比在OLTP系统中更容易地使用索引。但更多并不意味着将它们随意丢弃

分析查询。将它们从最常用到最不常用进行排序。有些仅用于每月、每季度或每年生成的报告。你几乎可以忘记这些——即使你可以将执行时间从10分钟减少到10秒……这可能不值得付出努力

针对执行频率最高的查询调整系统。然后,在不影响第一组的情况下,尽可能少地进行调整

哦,如果可以的话,还有一个关于覆盖索引的词。通常,我们被告知查看查询中提到的每个字段:

select  a, b, c
from    table
where   e = f
    and g > something;
然后覆盖索引将包含字段a、b、c、e、f和g

不一定是个好主意,或者至少不一定是最好的主意。考虑到过滤可以在到达一个非常小的或甚至一个结果之前涉及到数百、数千或数百万个记录。在只使用e、f和g进行过滤的同时,没有理由在包含字段a、b和c的索引周围混洗。这里最好的设计是两个覆盖指数:一个是a、b、c,另一个是e、f、g。将它们称为结果索引和筛选索引。因此,过滤是使用较小的行来执行的,每个I/O有更多的行,当所有这些工作完成后,再转到结果索引以获得更少的答案


但别忘了TCUR在这里也适用。只有一个好的、彻底的分析才能告诉你该怎么做。

如果你无法控制最终用户将要进行的搜索,那么你的性能就会出现问题;因此,您应该分析系统将要发出的查询,并为这些查询建立适当的索引。过度的索引维护会降低插入/更新性能,但如果索引都在使用中,则需要更多的内存来缓存索引,这就是您创建索引的原因,它们都将消耗RAM。请检查您的否:有很多选项会减慢查询计划,可能会使缓存数据变得困难,因为有许多选项可能不重复使用同一索引,可以假设从磁盘进行更多读取。。。因此,这不是绝对的否定。它可以减慢速度,而不是提高性能。