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 server 通过大型表中的SQL Server索引检索单个记录的时间_Sql Server_Performance_Indexing - Fatal编程技术网

Sql server 通过大型表中的SQL Server索引检索单个记录的时间

Sql server 通过大型表中的SQL Server索引检索单个记录的时间,sql-server,performance,indexing,Sql Server,Performance,Indexing,问题的简短版本: 如果您有一个包含大量小行的表,并且希望通过一个可能由两列组成的索引从该表中检索一条记录,那么这可能是低成本快速还是高成本慢速 问题和背景的较长版本: 我是一家软件开发公司的顾问,我与他们就我想添加到他们正在构建(我正在设计)的应用程序中的一项功能的性能影响进行了争论 目前,每当有人检索客户机记录时,我们都会写出一条日志记录。每次检索该记录时,我想将上次访问该记录的人的姓名和时间放在客户端页面上 他们说这对性能的影响很大,但基于我对B树如何工作的合理但非专家的知识,即使表非常大,

问题的简短版本:

如果您有一个包含大量小行的表,并且希望通过一个可能由两列组成的索引从该表中检索一条记录,那么这可能是低成本快速还是高成本慢速

问题和背景的较长版本:

我是一家软件开发公司的顾问,我与他们就我想添加到他们正在构建(我正在设计)的应用程序中的一项功能的性能影响进行了争论

目前,每当有人检索客户机记录时,我们都会写出一条日志记录。每次检索该记录时,我想将上次访问该记录的人的姓名和时间放在客户端页面上

他们说这对性能的影响很大,但基于我对B树如何工作的合理但非专家的知识,即使表非常大,这似乎也不正确

如果您在客户端记录的GUID和访问日期/时间(降序)上创建索引,那么您应该能够通过索引扫描检索所需的记录,该扫描只需要找到该GUID的第一个条目,然后停止?使用b树索引时,大部分索引都将被缓存,因此所需的物理磁盘访问数量将非常少,因此查询时间明显少于1s


或者我完全弄错了吗

应该是低成本和快速的,因为列被索引了,那将是O(n)我认为应该是低成本和快速的,因为列被索引了,那将是O(n)我认为你说最后一个访问的人?你的意思是每读一次,你就有一篇文章?
那么写操作会改变索引日期时间列吗

那我也会担心的


每次读取记录时写入都会导致大量额外的磁盘写入。这将阻止读取,并且可能对缓存也有害。您还需要经常更新索引,因为您更改了索引数据,所以您的索引将非常零碎。

您是说最后一个要访问的人吗?你的意思是每读一次,你就有一篇文章?
那么写操作会改变索引日期时间列吗

那我也会担心的


每次读取记录时写入都会导致大量额外的磁盘写入。这将阻止读取,并且可能对缓存也有害。您还需要经常更新索引,因为您更改了索引数据,所以您的索引将非常零碎。

您将遇到GUID索引零碎的问题,但因为您的行大小没有增加(正如您在评论中所说的),所以您不会遇到页面分割问题。通过重新组织和重建,可以解决随机插入问题

除此之外,你的方法没有错。如果表大于RAM,则每次访问可能只有一个磁盘IO(中间索引级别将被缓存)。如果您的数据适合RAM,您将为每个查询支付大约0.2到0.5ms的费用。如果数据在磁盘上,则搜索可能需要8-12毫秒。在SSD上,您可以返回到0.2ms到0.5ms(可能更多0.05ms)


为什么不创建一些测试数据(通过从1米行的sys.object中选择一个叉积)并测量它呢。这只需花费很少的时间,您会确定答案。

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

除此之外,你的方法没有错。如果表大于RAM,则每次访问可能只有一个磁盘IO(中间索引级别将被缓存)。如果您的数据适合RAM,您将为每个查询支付大约0.2到0.5ms的费用。如果数据在磁盘上,则搜索可能需要8-12毫秒。在SSD上,您可以返回到0.2ms到0.5ms(可能更多0.05ms)

为什么不创建一些测试数据(通过从1米行的sys.object中选择一个叉积)并测量它呢。这只需要很短的时间,你肯定会发现的。

这要看情况而定

一次检索成本低,速度快

  • 关于一个体面的索引表
  • 在像样的硬件上运行
  • 通过一个像样的网络
另一方面,这需要时间

如果我们谈论的是每小时一次检索,不要为此而烦恼。如果我们谈论的是每秒数千次的检索(而不是目前没有),那么将开始增加到可以注意到的程度

您需要回答的一些问题

  • 我的硬件符合规格吗
  • 添加两个字段是否会导致(不太可能)
  • 常规结果集需要额外读取多少页
  • 每秒将进行多少次检索
  • 每秒将进行多少次插入(触发索引更新)
在你回答了这些问题之后,你应该能够自己做出决定。就我的直觉而言,我会很惊讶你会注意到性能上的差异。

这要看情况而定

一次检索成本低,速度快

  • 关于一个体面的索引表
  • 在像样的硬件上运行
  • 通过一个像样的网络
另一方面,这需要时间

如果我们谈论的是每小时一次检索,不要为此而烦恼。如果我们谈论的是每秒数千次的检索(而不是目前没有),那么将开始增加到可以注意到的程度

您需要回答的一些问题