2012-01-31 50 views
1

短版的问题:时间来检索通过一个SQL Server索引的一条记录在一张大桌子

如果你有大量的小行的表,要恢复单个记录从通过可能由两列的索引这个表是这可能是东西,西港岛线是低成本,快速或成本高,速度慢

加长版问题和背景:

我是顾问使用sof tware开发公司,我与他们讨论了我想添加到他们正在构建的应用程序(以及我正在设计的)中的一项功能的性能影响。

目前,我们写出来的日志记录每次有人检索客户端记录。每次检索记录时,我都想把最后一个人的姓名和时间放在客户端页面上。

他们说,这对性能的影响将是高,但根据我的合理,但不是专家说明B树是如何工作的知识,这看起来不正确,即使该表是非常大的。

如果您在客户端记录的GUID和访问日期/时间(降序)上创建索引,那么您应该能够通过索引扫描检索所需的记录,该索引扫描只需要查找第一个输入该GUID然后停止?而且对于b-tree索引,大部分索引都会被缓存,因此所需的物理磁盘访问次数非常少,因此查询时间显着小于1秒。

还是我得到这个完全错误的

+1

你有一个GUID作为关键?那么你可能已经有潜在的性能问题。 – 2012-01-31 21:50:50

+0

@AlbinSunnanbo:我想你的意思是把GUID当成一个集群密钥。 – 2012-01-31 21:58:32

+0

客户和同事总是对表现有奇怪的想法。 – usr 2012-01-31 23:00:39

回答

1

您将遇到GUID索引碎片问题,但由于行的大小没有增加(如您在注释中所述),因此不会出现页面拆分问题。随机插入问题可以通过重新组织和重建来解决。

除此之外,还有什么不对你的方法。如果表大于RAM,则每次访问可能会有一个磁盘IO(中间索引级别将被缓存)。如果你的数据适合内存,你将支付每个查询大约0.2到0.5毫秒。如果您的数据在磁盘上,寻找可能需要8-12ms。在SSD上,你可以回到0.2ms到0.5ms(也许是0.05ms)。

为什么不创建一些测试数据(通过从1M行的sys.object中选择一个交叉产品)并进行测量。它需要很少的时间,你会发现肯定的。

+0

不知道我理解有关增加行大小的评论。每写一行,它将是一个固定的大小,它不会被更新。只是为了理解你的第二段 - 如果表格不适合RAM(几乎肯定不会),那么所需的行将被单个光盘访问取回,这将需要0.5ms? – 2012-01-31 23:57:00

+0

我们也为每个客户端提供了一个顺序增加的参考号,我们可以使用它来代替GUID。我的理解是,这将消除索引页面碎片/重组问题。 – 2012-02-01 19:35:23

+0

它会的。我添加了一些建议。 – usr 2012-02-01 21:05:40

0

应该是低成本和快速,因为列索引,这将是为O(n),我认为

+0

谢谢。对不起,不明白O(n)。 – 2012-01-31 22:09:00

+1

如果您不知道什么是大O符号,您可能需要在开始对性能做出假设之前进行自我教育。这可能作为一个很好的介绍:http://stackoverflow.com/questions/3255/big-o-how-do-you-calculate-approximate-it – lyrisey 2012-01-31 23:22:11

+1

好吧 - 现在undestand大O(我认为)。如果是这样的话,O(n)意味着搜索算法在索引中的记录数与时间之间具有线性关系。我的理解是,情况并非如此,一旦索引达到了一定的规模,如果搜索时间没有显着增加,就会出现显着的增长(假设页面不会被分割) – 2012-02-01 19:39:27

0

你说的最后一个人来访问?你的意思是说,对于每一次阅读,你都会写一篇文章?
那写就要改变索引日期时间列吗?

那我就太担心。

写在每个记录读取会导致你很多额外的磁盘写操作。这会阻止读取,也可能会对缓存造成影响。您还需要更新您的索引,并且由于您更改了索引数据,因此索引将非常分散。

+0

对不起 - 为了清楚起见,日志文件每次有人首次检索客户端并显示此客户端的摘要页面时都会更新;并非每次客户端记录都被读取 - 这将是一个更高的速度。尽管我们将记录添加到日志文件中,但它们并未更新。所以我们只是插入索引。我们认为写日志可能会产生影响,但我们已经这样做了。这是以我描述的方式阅读这个文件是减慢还是快速的问题。谢谢你的回复,tho。 – 2012-01-31 22:08:16

0

这要看情况。

一个单一的检索将是成本低,在一个体面的索引表

  • 过一个像样的网络
  • 上不俗的硬件

  • 运行在另一方面快速

    • 尽管如此,仍需要时间

      如果我们谈论的是每小时检索一次,请不要为此感到不适。如果我们正在谈论成千上万的检索每秒(而不是目前没有)开始加起来,这将是显而易见的。

      几个问题,你需要ADRESS

      • 是我的硬件符合规格
      • 是否添加两个字段导致page split(不太可能)
      • 多余的页面有多少需读取您的常规结果集
      • 每秒会产生多少次检索
      • 多少插入/秒(触发索引更新)将作出

      你不客气这些问题后,你应该能够使自己的决心。就我的直觉而言,我会很惊讶,你会注意到性能的差异。

  • +0

    谢谢 - 这是有帮助的。硬件和网络都可以。我认为我们正在每隔几秒钟就要检索一次检索(以及正在写入的日志记录)。日志文件列是日期/时间; UserGUID; ClientGUID;接入类型。软件开发人员担心这个文件的影响会越来越大(例如几百万),但我对b-树的回忆是它们对文件大小不敏感 – 2012-02-01 19:29:45

    相关问题