标签: query-optimization

如何分析Sqlite查询执行?

我有一个Sqlite数据库,我想检查索引是否正确.MS SQL Analyzer非常适合分解查询执行和利用索引.

Sqlite有类似的工具吗?

sql sqlite query-optimization sql-execution-plan

24
推荐指数
3
解决办法
2万
查看次数

SQL:内部连接两个大型表

我有两个大表,每个表有大约1亿条记录,我担心我需要在两者之间进行内部连接.现在,两张桌子都非常简单; 这是描述:

BioEntity表:

  • BioEntityId(int)
  • 名称(nvarchar 4000,虽然这是一个过度杀手)
  • TypeId(int)

EGM表(一个辅助表,实际上是批量导入操作的结果):

  • EMGId(int)
  • PId(int)
  • 名称(nvarchar 4000,虽然这是一个过度杀手)
  • TypeId(int)
  • LastModified(日期)

我需要获得匹配的名称,以便将BioEntityId与驻留在EGM表中的PId相关联.最初,我尝试使用单个内连接执行所有操作,但查询似乎占用时间太长,数据库的日志文件(在简单恢复模式下)设法咀嚼所有可用磁盘空间(刚刚超过200 GB,当数据库占用18GB)并且等待两天后查询将失败,如果我没有弄错的话.我设法保持日志不会增长(现在只有33 MB),但查询已经连续运行了6天,并且它看起来不会很快就会停止.

我在相当不错的计算机上运行它(4GB RAM,Core 2 Duo(E8400)3GHz,Windows Server 2008,SQL Server 2008)并且我注意到计算机偶尔会每30秒(给予或接受)一次几秒钟.这使得它很难用于其他任何事情,这真的让我感到紧张.

现在,这是查询:

 SELECT EGM.Name, BioEntity.BioEntityId INTO AUX
 FROM EGM INNER JOIN BioEntity 
 ON EGM.name LIKE BioEntity.Name AND EGM.TypeId = BioEntity.TypeId
Run Code Online (Sandbox Code Playgroud)

我手动设置了一些索引; EGM和BioEntity都有一个包含TypeId和Name的非聚集覆盖索引.但是,查询运行了五天,它也没有结束,所以我尝试运行Database Tuning Advisor来使事情发挥作用.它建议删除我的旧索引并创建统计信息和两个聚簇索引(每个表上一个,只包含我发现相当奇怪的TypeId - 或者只是简单的愚蠢 - 但我还是试了一下).

它现在已经运行了6天,我仍然不确定该怎么做......任何想法的人?我怎样才能更快(或者至少有限)?

更新: - 好的,我已取消查询并重新启动服务器以使操作系统重新启动并运行 - 我正在使用您提议的更改重新运行工作流程,特别是将nvarchar字段裁剪为更小的尺寸并交换"like"为"=".这将需要至少两个小时,所以我稍后会发布进一步的更新

更新2(格林尼治标准时间下午1点,2009年11月18日): - 估计的执行计划显示有关表扫描的成本为67%,然后是33%的哈希匹配.接下来是0%的并行性(这不是很奇怪吗?这是我第一次使用估计的执行计划,但这个特殊的事实只是抬起了我的眉毛),0%哈希匹配,0%并行度,0%顶部,0 %table insert和最后另一个0%select into.似乎索引是垃圾,正如预期的那样,所以我将制作手动索引并丢弃糟糕的建议.

sql sql-server inner-join query-optimization sql-server-2008

24
推荐指数
4
解决办法
3万
查看次数

如何强制子查询和#temp表一样执行?

我正在重复Mongus Pong提出的问题 为什么使用临时表比嵌套查询更快?没有一个适合我的答案.

我们大多数人在某些时候发现,当嵌套查询达到某种复杂性时,需要将其分解为临时表以保持其性能.这是荒谬的,这可能永远是最实用的方式向前意味着这些过程不能再被制作成图.通常第三方BI应用程序只能很好地与视图一起使用,因此这是至关重要的.

我确信必须有一个简单的查询计划设置,使引擎只是依次为每个子查询假脱机,从内到外工作.没有第二个猜测它如何使子查询更具选择性(它有时非常成功)并且没有相关子查询的可能性.只是程序员打算通过括号之间的自包含代码返回的数据堆栈.

我常常发现,简单地从子查询更改为#table需要花费120秒到5秒的时间.本质上,优化器在某个地方犯了一个重大错误.当然,可能有非常耗时的方式我可以诱使优化器以正确的顺序查看表,但即使这样也无法保证.我不是要求理想的2秒执行时间,只是temp tabling在视图灵活性范围内提供的速度.

我以前从未在这里发帖,但我已经写了多年的SQL,并且已经阅读了其他有经验的人的评论,他们也刚刚接受了这个问题,现在我只想让合适的天才前进并说出来特别提示是X ...

sql-server optimization performance query-optimization sql-server-2008

24
推荐指数
2
解决办法
8308
查看次数

我如何使用DB2 Explain?

我如何使用DB2的Explain函数? - 既可以运行它,也可以用它来优化查询.有没有更好的DB2工具?

我之前已经建立了查询,但是我必须告诉他们需要多长时间的唯一方法就是运行它们并计算时间 - 这几乎不是理想的.

编辑:我的答案结果是"你做不到.你没有,也无法获得访问权限." 你不喜欢官僚主义吗?

sql db2 query-optimization explain

23
推荐指数
3
解决办法
7万
查看次数

我可以通过在列x上创建索引来优化SELECT DISTINCT x FROM hugeTable查询吗?

我有一个巨大的表,在某些列上具有更小的数量(按数量级)不同的值x.

我需要做一个查询SELECT DISTINCT x FROM hugeTable,我想要相对快速地做这个.

我做了类似的事情CREATE INDEX hugeTable_by_x ON hugeTable(x),但由于某种原因,即使输出很小,查询执行也不是那么快.查询计划显示97%的时间花在索引扫描上hugeTable_by_x,估计行数等于整个表的大小.接下来是哈希匹配操作.

由于我在列上创建了索引x,我不能指望此查询运行得非常快吗?

请注意,我正在使用Microsoft SQL Server 2005.

sql t-sql indexing sql-server-2005 query-optimization

22
推荐指数
3
解决办法
2万
查看次数

在SQL中通过子字符串查找字符串的最快方法?

我有两个列的巨大表:Id和Title.我是bigint,我可以自由选择Title列的类型:varchar,char,text等等.列标题包含随机文本字符串,如"abcdefg","q","allyourbasebelongtous",最多255个字符.

我的任务是通过给定子字符串获取字符串.子串也具有随机长度,可以是字符串的开始,中间或结尾.最明显的执行方式:

SELECT * FROM t LIKE '%abc%'
Run Code Online (Sandbox Code Playgroud)

我不关心INSERT,我只需要做快速选择.我该怎么做才能尽快进行搜索?

我使用MS SQL Server 2008 R2,全文搜索将毫无用处,据我所知.

sql sql-server full-text-search query-optimization sql-server-2008-r2

22
推荐指数
2
解决办法
3万
查看次数

如何进一步优化派生表查询,该查询的性能优于JOINed等效项?

更新:我找到了解决方案.请参阅下面的答案.

我的问题

如何优化此查询以最大限度地减少停机时间?我需要更新50多个模式,门票数量从100,000到200万不等.是否可以尝试同时在tickets_extra中设置所有字段?我觉得这里有一个解决方案,我只是没有看到.我一直在打击这个问题超过一天.

另外,我最初尝试不使用子SELECT,但表现得太多比我现在有更坏.

背景

我正在尝试优化我的数据库以获取需要运行的报告.我需要聚合的字段计算起来非常昂贵,因此我对现有模式进行了非规范化以适应此报告.请注意,通过删除几十个不相关的列,我简化了故障单表.

我的报告将按创建时管理器解析后管理器聚合票证计数.这个复杂的关系如下图所示:

EAV http://cdn.cloudfiles.mosso.com/c163801/eav.png

为了避免在运行中计算这个需要的六个令人讨厌的连接,我已经将以下表添加到我的模式中:

mysql> show create table tickets_extra\G
*************************** 1. row ***************************
       Table: tickets_extra
Create Table: CREATE TABLE `tickets_extra` (
  `ticket_id` int(11) NOT NULL,
  `manager_created` int(11) DEFAULT NULL,
  `manager_resolved` int(11) DEFAULT NULL,
  PRIMARY KEY (`ticket_id`),
  KEY `manager_created` (`manager_created`,`manager_resolved`),
  KEY `manager_resolved` (`manager_resolved`,`manager_created`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

现在的问题是,我没有将这些数据存储在任何地方.经理总是动态计算.我在几个数据库中拥有数百万张票,这些数据库具有需要填充此表的相同模式.我希望以尽可能高效的方式执行此操作,但是在优化我正在使用的查询时未能成功:

INSERT INTO tickets_extra (ticket_id, manager_created)
SELECT
  t.id, 
  su.user_id …
Run Code Online (Sandbox Code Playgroud)

mysql sql optimization derived-table query-optimization

21
推荐指数
1
解决办法
8012
查看次数

如何比较两个查询?

我如何比较两个查询X和Y并说X比Y更好,当他们在小情况下几乎占用相同的时间?

问题是我有两个应该在一个非常大的数据库上运行的查询,所以运行和评估不是一个选择.因此,我们创建了一个小型数据库来执行一些测试.评估哪个查询更好是一个问题,因为在我们的测试基础上,它们几乎在同一时间运行(大约5分钟).除了返回的时间之外,衡量查询有多好的另一种方法是什么?

sql-server query-optimization

21
推荐指数
2
解决办法
2万
查看次数

如何基于EXPLAIN计划优化MySQL查询

查看查询EXPLAIN计划,如何确定最佳优化位置?

我很欣赏首先要检查的是,是否正在使用好的索引,但除此之外我还有点难过.通过过去的反复试验,我有时发现连接的顺序可以是一个很好的改进来源,但是如何通过查看执行计划来确定?

虽然我非常希望获得对如何优化查询的好大致的了解(建议阅读非常感谢!),我也认识到,它往往更容易讨论比抽象的谈具体案例.因为我正在用这个撞到墙上,所以你的想法会非常感激:

id   select_type   table   type     possible_keys    key       key_len   ref                    rows   Extra
 1   SIMPLE        S       const    PRIMARY,l,p,f4   PRIMARY         2   const                     1   Using temporary
 1   SIMPLE        Q       ref      PRIMARY,S        S               2   const                   204   Using index
 1   SIMPLE        V       ref      PRIMARY,n,Q      Q               5   const,db.Q.QID            6   Using where; Using index; Distinct
 1   SIMPLE        R1      ref      PRIMARY,L        L             154   const,db.V.VID          447   Using index; Distinct
 1   SIMPLE        W       eq_ref   PRIMARY,w        PRIMARY         5   const,db.R.RID,const      1   Using where; Distinct
 1   SIMPLE        R2      eq_ref   PRIMARY,L …

mysql query-optimization

21
推荐指数
1
解决办法
2万
查看次数

可以重用子查询吗?

我在尝试执行查询时遇到了一些问题.我有两个表,一个包含元素信息,另一个表包含与第一个表的元素相关的记录.我们的想法是在同一行中获取元素信息和几条记录信息.

结构可以解释如下:

 table [ id, name ]
 [1, '1'], [2, '2']

 table2 [ id, type, value ]
 [1, 1, '2009-12-02']
 [1, 2, '2010-01-03']
 [1, 4, '2010-01-03']
 [2, 1, '2010-01-02']
 [2, 2, '2010-01-02']
 [2, 2, '2010-01-03']
 [2, 3, '2010-01-07']
 [2, 4, '2010-01-07']
Run Code Online (Sandbox Code Playgroud)

这是我想要实现的目标:

 result [id, name, Column1, Column2, Column3, Column4]

 [1, '1', '2009-12-02', '2010-01-03', , '2010-01-03']
 [2, '2', '2010-01-02', '2010-01-02', '2010-01-07', '2010-01-07']
Run Code Online (Sandbox Code Playgroud)

以下查询获得了正确的结果,但在我看来效率非常低,不得不为每列迭代table2.无论如何都可以做一个子查询并重用它?

SELECT
      a.id,
      a.name,
      (select min(value) from table2 t where t.id = subquery.id and t.type = 1 group by …
Run Code Online (Sandbox Code Playgroud)

sql subquery query-optimization

20
推荐指数
2
解决办法
3万
查看次数