Questions tagged «optimization»

在数据库的上下文中,优化是指查询优化器选择有效的物理执行计划的过程。

3
如何在DateAdd()约束下的索引中改进视图中1行的估计
使用Microsoft SQL Server 2012(SP3)(KB3072779)-11.0.6020.0(X64)。 给定一个表和索引: create table [User].[Session] ( SessionId int identity(1, 1) not null primary key CreatedUtc datetime2(7) not null default sysutcdatetime()) ) create nonclustered index [IX_User_Session_CreatedUtc] on [User].[Session]([CreatedUtc]) include (SessionId) 以下每个查询的“实际行数”为3.1M,估计的行数显示为注释。 当这些查询在View中提供另一个查询时,由于1行估算,优化器选择循环连接。 如何在此基础上改进估计,以避免覆盖父查询联接提示或求助于SP? 使用硬编码日期非常有用: select distinct SessionId from [User].Session -- 2.9M (great) where CreatedUtc > '04/08/2015' -- but …

2
在一系列时间戳(一列)上优化查询
我正在通过Heroku使用Postgres 9.3。 我有一个表“ traffic”,其中有1M +条记录,每天都有许多插入和更新。我需要在此表上的不同时间范围内执行SUM操作,这些调用最多可能需要40秒钟,并且希望听到有关如何改进该建议的建议。 我在此表上有以下索引: CREATE INDEX idx_traffic_partner_only ON traffic (dt_created) WHERE campaign_id IS NULL AND uuid_self <> uuid_partner; 这是一个示例SELECT语句: SELECT SUM("clicks") AS clicks, SUM("impressions") AS impressions FROM "traffic" WHERE "uuid_self" != "uuid_partner" AND "campaign_id" is NULL AND "dt_created" >= 'Sun, 29 Mar 2015 00:00:00 +0000' AND "dt_created" <= …

2
SQL Server表插入性能优化
设置 在一个数据仓库中,我将一个事实表连接到20个维度。事实表具有3200万行和30列。这是一个临时暂存表,因此我不必与其他正在读取或写入该表的用户打交道。我从基础表中选择10列,并从各个维度中选择20列。尺寸表很小(介于3到15.000行之间)。连接的字段都是整数和nvarchars。我使用SELECT ... INTO语句。表上没有索引。 该查询的执行速度太慢,无法使用。 尝试过的解决方案 因为查询处理时间太长,所以我尝试了以下解决方案: 将20个联接拆分为5个表上的4个联接。但是查询性能仍然很低。 将索引放在外键列上。没有明显的时间减少。 确保联接条件的字段为整数。我注意到性能提高了25%。不完全是我要寻找的。 使用insert into语句代替select into。尽管数据库处于简单恢复模式,但由于日志文件增长而导致性能更差。 这些发现使我包括了实际的执行计划,该计划表明89%的成本在表插入中。其他成本是对事实表进行8%的表扫描,对内部联接进行2%的哈希匹配。 问题 缓慢插入表的可能原因是什么? 没有执行计划,有哪些方法可以识别此瓶颈? 我可以采取什么措施来减少表格插入的费用?

2
使用COALESCE(…)优化子查询的选择
我在应用程序中使用的视图很大。我认为我已经缩小了性能问题,但是不确定如何解决。视图的简化版本如下所示: SELECT ISNULL(SEId + '-' + PEId, '0-0') AS Id, *, DATEADD(minute, Duration, EventTime) AS EventEndTime FROM ( SELECT se.SEId, pe.PEId, COALESCE(pe.StaffName, se.StaffName) AS StaffName, -- << Problem! COALESCE(pe.EventTime, se.EventTime) AS EventTime, COALESCE(pe.EventType, se.EventType) AS EventType, COALESCE(pe.Duration, se.Duration) AS Duration, COALESCE(pe.Data, se.Data) AS Data, COALESCE(pe.Field, se.Field) AS Field, pe.ThisThing, se.OtherThing …


1
如何在MySQL中优化InnoDB表
我一直在研究如何仅在MySQL中优化碎片表,并回顾了有关优化表的文章。基本上,它针对任何表对information_schema数据库执行查询,data_free > 0并OPTIMIZE仅对那些表构建SQL语句。我运行了此查询,它确定了148个表以进行优化。标识的所有表都是InnoDB表。执行结果优化SQL脚本后,我重新运行原始脚本以识别碎片表,并在第一遍过程中返回完全相同的表。 我看到了有关InnoDB表和OPTIMIZE命令的冲突帖子。有人说这OPTIMIZE不适用于InnoDB表,需要运行ALTER TABLE table_name ENGINE=INNODB。其他人则说,针对InnoDB表执行时OPTIMIZE实际上会调用该ALTER TABLE命令。考虑到这一点,我ALTER TABLE对被标识为碎片(data_free > 0)的InnoDB表之一运行了该命令,发现其data_free之后没有改变。它仍然大于0。我还重新启动了MySQL,并检查了它以发现相同的结果。 现在,我们组织中有几台运行MySQL 5.5.29的服务器,我对所有服务器进行了查询,以识别出任何带有InnoDB表且未DATA_FREE=0 or NULL返回任何表。它们都大于零。 我还OPTIMIZE对一些大于零的MyISAM表运行了该命令,DATA_FREE然后验证它是否为零。 谁能为我阐明一下?从InnoDB表中删除碎片的正确方法是什么?确定零散的InnoDB表的正确方法是什么? 谢谢

2
使用JOIN有效地更新表
我有一个表,其中包含住户的详细信息,而另一个表中包含与住户相关的所有人员的详细信息。对于家用表,我有一个主键,它使用两列定义[tempId,n]。对于人员表,我有一个使用其3列定义的主键[tempId,n,sporder] 使用由主键上的聚集索引指示的排序,我为每个家庭[HHID]和每个人[PERID]记录生成了唯一的ID (下面的代码段用于生成PERID): ALTER TABLE dbo.persons ADD PERID INT IDENTITY CONSTRAINT [UQ dbo.persons HHID] UNIQUE; 现在,我的下一步是将每个人与相应的家庭相关联,即:将a映射[PERID]到[HHID]。两个表之间的人行横道基于两列[tempId,n]。为此,我有以下内部连接语句。 UPDATE t1 SET t1.HHID = t2.HHID FROM dbo.persons AS t1 INNER JOIN dbo.households AS t2 ON t1.tempId = t2.tempId AND t1.n = t2.n; 我总共有1928783户家庭记录和5239842人记录。当前执行时间非常长。 现在,我的问题是: 是否可以进一步优化此查询?更一般而言,优化联接查询的经验法则是什么? 是否有另一个查询构造可以在更短的执行时间内达到我想要的结果? 我已将SQL Server 2008生成的针对整个脚本的执行计划上载到 SQLPerformance.com

1
针对瞬时数据优化PostgreSQL
我有几张桌子,每张桌子都有100-300个整数类型的列,这些表保存高度易变的数据。数据集由一或两个主键进行键控,当刷新发生时,整个数据集将被删除,新数据将被插入到一个事务中。数据集的大小通常为几百行,但在极端情况下可以达到几千行。刷新每秒发生一次,并且通常不区分针对不同键的数据集更新,因此删除和重新创建表是不可行的。 如何调整Postgres以处理此类负载?如果有任何不同,我可以使用最新和最好的版本。


4
MySQL子查询速度大大降低,但它们独立运行良好
查询1: select distinct email from mybigtable where account_id=345 需要0.1秒 查询2: Select count(*) as total from mybigtable where account_id=123 and email IN (<include all from above result>) 需要0.2秒 查询3: Select count(*) as total from mybigtable where account_id=123 and email IN (select distinct email from mybigtable where account_id=345) 花费22分钟和90%的时间处于“准备”状态。为什么要花这么多时间。 表是在MySQL 5.0上具有320万行的innodb

1
MySQL按表读取/写入
我正在优化数据库。本质上,我试图在数据库中找到写入最多和读取最多的表。之后,我将把这些表符号链接到单独的驱动器中。 有没有一种方法可以跟踪每个表的活动?就像在后面的IOPS中一样,每个表的写入,读取次数是多少?

2
大量插入的InnoDB表不会使用我所有的CPU
我有一个数据包日志数据库,几乎从未查询过。它只需要在插入时快速。我之所以使用InnoDB,是因为我想保持ACID合规性,因为即使丢失单个数据包也可能损害我们的客户。在性能调整方案中,我通过多个数据库连接将1,000,000个数据包发送到服务器。但是,无论我在my.cnf中使用什么设置,我都无法使mysqld进程在具有12个核心的系统上使用超过900%的CPU。(盒子上没有其他东西。) 我设置了以下内容 innodb_file_per_table = 1 innodb_write_io_threads = 64 innodb_read_io_threads = 64 innodb_thread_concurrency = 0 如果使用MyISAM,则可以在大约6秒钟内获得所有写入的数据包。但是InnoDB大约需要25。我可以让MySQL使用其余的系统资源并更快地插入吗? 编辑:这是表的架构: +-------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------------------+------+-----+---------+-------+ | t | bigint(20) unsigned | YES | | NULL | | | a | char(1) | YES | …

4
如何在MySQL上加快“显示列”的速度?
我的应用程序依赖于为某些表运行“显示列”。运行大约需要60毫秒,而我们所有其他查询都需要不到1毫秒。information_schema直接查询甚至更慢。 该数据库包含约250个数据库,每个数据库100至200个表(总计约2万个表)。 如何找出这些操作为何如此缓慢? 也许我可以更改某些设置以使其运行更快,或将其缓存到SQL端吗? (该应用程序每页面加载大约执行14个这样的查询-我很清楚,这个旧代码需要清理,但是在进行长期修复时会寻找可能的选项。)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.