问题标签 [query-optimization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
135033 浏览

sql - PostgreSQL - 获取列的最大值的行

我正在处理一个 Postgres 表(称为“lives”),其中包含带有 time_stamp、usr_id、transaction_id 和 live_remaining 列的记录。我需要一个查询,该查询将为我提供每个 usr_id 的最新 lives_remaining 总数

  1. 有多个用户(不同的 usr_id)
  2. time_stamp 不是唯一标识符:有时用户事件(在表中逐行)会以相同的 time_stamp 发生。
  3. trans_id 仅在非常小的时间范围内是唯一的:随着时间的推移它会重复
  4. 剩余寿命(对于给定用户)可以随时间增加和减少

例子:

因为我需要使用每个给定 usr_id 的最新数据访问行的其他列,所以我需要一个查询,它会给出如下结果:

如前所述,每个 usr_id 都可能获得或失去生命,有时这些带时间戳的事件发生得如此接近以至于它们具有相同的时间戳!因此,此查询将不起作用:

相反,我需要同时使用 time_stamp(第一)和 trans_id(第二)来识别正确的行。然后,我还需要将该信息从子查询传递到主查询,主查询将为相应行的其他列提供数据。这是我已经开始工作的黑客查询:

好的,所以这行得通,但我不喜欢它。它需要一个查询中的一个查询,一个自连接,在我看来,通过抓取 MAX 发现具有最大时间戳和 trans_id 的行可以更简单。表“lives”有数千万行要解析,所以我希望这个查询尽可能快速和高效。我尤其是 RDBM 和 Postgres 的新手,所以我知道我需要有效地使用正确的索引。我对如何优化有点迷茫。

我在这里找到了类似的讨论。我可以执行某种与 Oracle 分析功能等效的 Postgres 类型吗?

任何有关访问聚合函数(如 MAX)使用的相关列信息、创建索引和创建更好的查询的建议将不胜感激!

PS您可以使用以下内容创建我的示例案例:

0 投票
7 回答
22871 浏览

sql - 对于自动增量字段:MAX(ID) vs TOP 1 ID ORDER BY ID DESC

我想从一个字段中找到最高的 AutoIncremented 值。(在我可以使用的插入之后,它没有被获取@@SCOPE_IDENTITY等)这两个查询中的哪一个会运行得更快或提供更好的性能。 Id是 的主键和autoincrement字段Table1。这是针对 Sql Server 2005 的。

[编辑]
是的,在这种情况下Id是我定义聚集索引的字段。
如果索引是ID DESC什么..是的,如果 1.Id 是聚集索引 + 主键
,那么很高兴知道性能会受到怎样的影响。 2.id是聚集索引,不是主键。 3.id是非聚集索引ASC+主键。 4.id是非聚集索引ASC,不是主键。 5.id是非聚集索引DESC+主键。 6. id是非聚集索引DESC而不是主键。 7. 身份证只是






AutoIncrement

希望这不是一个艰巨的任务!

0 投票
8 回答
4951 浏览

sql - 为什么这个查询要进行全表扫描?

查询:

事实:

  • 甲骨文快捷版
  • tbl1.t1_pk 是主键。
  • tbl2.t2_fk_t1_pk 是该 t1_pk 列上的外键。
  • tbl2.t2_lkup_1 已编入索引。
  • tbl3.t3_pk 是主键。
  • tbl2.t2_fk_t3_pk 是该 t3_pk 列上的外键。

对 tbl1 中 11,000 行和 tbl2 中 3500 行的数据库解释计划表明它正在对 tbl1 进行全表扫描。在我看来,如果它可以在 tbl1 上进行索引查询,它应该会更快。

对 tbl1 中 11,000 行和 tbl2 中 3500 行的数据库解释计划表明它正在对 tbl1 进行全表扫描。在我看来,如果它可以在 tbl1 上进行索引查询,它应该会更快。

更新:我尝试了你们中的一些人建议的提示,但解释成本变得更糟了!现在我真的很困惑。

进一步更新:我终于可以访问生产数据库的副本,“解释计划”使用索引和成本低得多的查询显示它。我猜想拥有更多数据(tbl1 中超过 100,000 行,tbl2 中超过 50,000 行)是它决定索引值得的原因。感谢所有帮助过的人。我仍然认为 Oracle 性能调优是一门魔法,但我很高兴你们中的一些人理解它。

进一步更新:我应前雇主的要求更新了这个问题。他们不喜欢他们的表名出现在谷歌查询中。我应该知道的更好。

0 投票
4 回答
14317 浏览

performance - 如何实现线程注释?

我正在开发一个可以支持线程注释的 Web 应用程序。我需要能够根据收到的票数重新排列评论。(与reddit中线程评论的工作方式相同)

我很想听听 SO 社区关于如何做到这一点的意见。

我应该如何设计评论表?这是我现在使用的结构:

应该对这个结构做哪些改变?

我应该如何从该表中获取详细信息以便以正确的方式显示它们?(欢迎以任何语言实现。我只是想知道如何以最好的方式做到这一点)

在实现此功能以减少 CPU/数据库的负载时,我需要注意哪些事项?

提前致谢。

0 投票
8 回答
5199 浏览

sql - 查询 250k 行需要 53 秒

运行此查询的机器是在数据中心中运行的专用服务器。

AMD Opteron 1354 四核 2.20GHz 2GB RAM Windows Server 2008 x64(是的,我知道我只有 2GB 的 RAM,当项目上线时我将升级到 8GB)。

因此,我在一个表中创建了 250,000 个虚拟行,以对 LINQ to SQL 生成的一些查询进行真正的压力测试,并确保它们不会太糟糕,我注意到其中一个花费了荒谬的时间。

我用索引将这个查询缩短到 17 秒,但为了从头到尾回答这个问题,我删除了它们。只有索引是主键。

目前在数据库中有 1 个用户、1 个类别和 250,000 个故事,我尝试运行此查询。

查询需要 52 秒运行,CPU 使用率徘徊在 2-3%,成员为 1.1GB,900MB 可用但磁盘使用似乎失控。它是@ 100MB/秒,其中 2/3 写入 tempdb.mdf,其余从 tempdb.mdf 读取。

现在是有趣的部分......

所有这 3 个查询几乎都是即时的。

执行第一个查询的计划。
http://i43.tinypic.com/xp6gi1.png

执行其他 3 个查询的计划(按顺序)。
http://i43.tinypic.com/30124bp.png
http://i44.tinypic.com/13yjml1.png
http://i43.tinypic.com/33ue7fb.png

任何帮助将非常感激。

添加索引后执行计划(再次下降到 17 秒)。
http://i39.tinypic.com/2008ytx.png

我从每个人那里得到了很多有用的反馈,我感谢你们,我在这方面尝试了一个新的角度。我查询我需要的故事,然后在单独的查询中获取类别和用户,并且通过 3 个查询只花了 250 毫秒...我不明白这个问题,但如果它有效并且暂时不低于 250 毫秒,我会坚持下去。这是我用来测试的代码。

0 投票
4 回答
3571 浏览

sql - 如何强制 SQL Server 以特定顺序执行查询

我有以下查询

此查询需要 5 到 17 秒才能运行,但是在许多情况下,函数 dbo.udf_get_event_sitelist(@siteId, @userId) 不返回任何行,因此查询不会找到任何数据。

如何强制 SQL Server 首先执行用户定义的函数。我很欣赏我可以将查询重写为存储过程并首先执行子选择,但是如果可能的话,我想在单个 SQL 语句中执行此操作。

0 投票
2 回答
415 浏览

mysql - 运行时查询分析和优化

我想知道是否有某种运行时机制可以观察针对我的数据库服务器运行的查询;记录每个“类型”有多少查询正在运行;查看这些查询的性能;然后,根据此运行时数据,建议需要添加/删除哪些索引。

我目前正在与 MySQL 作斗争;如果您知道其他数据库供应商的类似工具,我也很想知道。谢谢!!

0 投票
3 回答
652 浏览

linq - 优化或“调整”LINQ 表达式的最佳方法是什么?

在构造 LINQ 表达式(对我来说,是 linq to objects)时,有很多方法可以完成某事,有些方法比其他方法好得多、效率高。

  • 有没有“调整”或优化这些表达式的好方法?
  • 人们使用哪些基本指标,您如何收集它们?
  • 有没有办法获得“总迭代次数”计数或其他一些指标,您可以“知道”越低意味着越好?

编辑

感谢理查德/乔恩的回答。

看起来我真正想要的是一种为 LINQ 表达式获取简单操作计数“OCount”的方法,尽管我不确定 LINQ 中是否存在允许它的钩子。假设我有一个特定机器硬件(SLA)的目标性能水平。理想情况下,我会添加一个单元测试来确认通过该查询移动的典型数据将在分配的时间内(来自 SLA)处理。问题是这将在构建服务器/开发人员机器/等上运行。这可能与 SLA 的机器硬件几乎没有相似之处。所以我的想法是,我将为表达式确定一个可接受的最大“OCount”,知道如果 OCount 小于 X,它肯定会在目标“典型”硬件上在 SLA 下提供可接受的性能。如果 OCount 超过此阈值,构建/单元测试会产生警告。理想情况下,我想要这样的东西(伪代码):

其中 results.OCount 只会给我生成结果集所需的总迭代次数 (n)。

为什么我会喜欢这个??

好吧,即使是大小适中的 LINQ 表达式,由于增加了整体操作数,微小的更改/添加也会对性能产生巨大影响。应用程序代码仍然会通过所有单元测试,因为它仍然会产生正确的结果,但在部署时运行缓慢。

另一个原因是简单的学习。如果你做某事并且 OCount 上升或下降一个数量级,那么你就会学到一些东西。

编辑#2 我也会提出一个潜在的答案。这不是我的,它来自Cameron MacFarland,来自我问的另一个问题,它产生了这个问题。事实证明,我认为这个问题的答案可以在单元测试环境中工作,就像我在第一次编辑这个问题时描述的那样。

它的本质是在单元测试夹具中创建测试数据集,您按照此答案中概述的方式将其输入 LINQ 表达式,然后将迭代计数相加并与最大允许迭代计数进行比较。

在这里查看卡梅伦的答案

0 投票
4 回答
4108 浏览

sql-server - 组合索引与多个单索引与全文索引的查询性能

背景:我有一个包含 500 万个地址条目的表格,我想搜索不同的字段(客户姓名、联系人姓名、邮编、城市、电话...),最多 8 个字段。数据相当稳定,一天最多修改50次,所以几乎只有读权限。

用户不应该提前告诉我他在搜索什么,我还希望支持组合搜索(搜索词的 AND 连接)。例如,“lincoln+lond”应在任何搜索字段中搜索包含两个搜索词的所有记录,以及以任何词开头的条目(如本例中的“London”)。

问题:现在我需要为这个搜索表选择一个索引策略。(附带说明:我正在尝试实现亚秒级响应时间,最差响应时间应该是 2 秒。)在性能方面更好的是:

  1. 从所有可查询的列中做一个组合索引(需要 2 个,因为达到了 900 字节的索引限制)
  2. 在每个可查询列上放置单个索引
  3. 在可查询列上建立全文索引并使用全文查询

我放弃了第 1 点,因为它似乎没有任何优势(索引使用会受到限制,并且不会有“索引搜索”,因为并非所有字段都适合一个索引)。

问题:现在,我应该使用多个单索引变体还是应该使用全文索引?有没有其他方法可以实现上述功能?

0 投票
4 回答
979 浏览

database-design - 对于包含大量记录的审计表,这是一个好的设计吗?

我有一个表格,可以按每件单品跟踪库存数据。这是表格的简化版本(排除了一些非关键字段):

每次给定部分发生问题时,都会创建一个新的审计记录。例如,我的产品 ABC 第一次添加到库存时,我会得到如下记录:

如果 ABC 序列号 555 的成本发生变化,我得到一个新记录:

如果这件作品被售出,我会得到另一张唱片:

如果引入一条新的 ABC,我得到这个记录:

我需要能够在任何时间点尽可能快地获得一组给定产品的现有库存价值。

使用上面的示例,如果我想获取 2009 年 1 月 2 日的产品 ABC 的库存值,我需要为每个唯一的产品/序列号组合选择01/03/之前的最新记录2009 年,状态为“OnHand”,然后将费用加起来。(我不能 100% 确定这个 select 语句在这一点上会是什么样子,但我会做一些实验)。

我的问题:对于我所描述的审计表类型,这是一个好的结构吗?也就是说,如果索引得当,它是否适合快速查询?(我试图想象当这张表增长到数百万行时会发生什么。)

我是否应该将历史记录拆分到一个单独的表中,并且只将每个 ProductID/SerialNumber 组合的最新记录留在“活动”表中?

任何反馈/建议/评论/链接表示赞赏。

谢谢!