Questions tagged «performance»

对系统是否运行良好以适合目标的评估。通常,性能是指系统随时间完成一个或一组操作的速度。

3
配置PostgreSQL的写入性能
我的PostgreSQL服务器之一托管着几个(1-3)数据库,这些数据库接收恒定的数据流。数据不是特别结构化的,它等于当前时间以及该特定时刻的各种观测数据。数据速率相当高;对于一个数据库,它一天的工作量约为1 GB,而对于另一个数据库,它的工作量约为每天的十分之一。我不希望这个比率增加。读取性能的优先级要低得多,目前可以接受。 在日志中,我有此消息: LOG: checkpoints are occurring too frequently (15 seconds apart) HINT: Consider increasing the configuration parameter "checkpoint_segments". 此值当前设置为16,这是由提供的pgtune。 我应该考虑哪些设置来提高写入性能?我希望保持尽可能的安全。考虑到传入的数据量,我可以接受一次失败就丢失一些最近的数据,只要其中的大部分数据是完整的即可。 编辑:我现在正在使用PostgreSQL 9.0,但是我计划升级到9.1。我不会发布硬件细节,因为尽管我承认它们的重要性,但最终我将需要在硬件非常多样化的多台机器上进行此优化。如果硬件对于答案是必不可少的,请给我基本信息,这样我就可以将答案应用于具有不同硬件配置的机器。

5
在PostgreSQL中非常慢的DELETE,解决方法?
我在PostgreSQL 9.2上有一个数据库,该数据库的主结构包含约70个表,并且每个客户机模式的结构相同的变量数量各不相同,每个表有30个表。客户端模式具有引用主模式的外键,而不是相反的方式。 我刚刚开始使用从先前版本中获取的一些真实数据填充数据库。当我不得不在主模式的非常中央的表中进行批量删除时,数据库已达到约1.5 GB(预计数周之内将增长到几十GB)。所有相关的外键都标记为ON DELETE CASCADE。 这将花费很长时间也就不足为奇了,但是在12个小时之后,很明显,我最好从头开始,删除数据库并再次启动迁移。但是,如果我需要在数据库正常运行并且更大时再重复此操作,该怎么办?是否有其他更快的方法? 如果我编写了一个脚本,该脚本将浏览从属表,从中央表最远的表开始,逐表删除从属行,会更快吗? 一个重要的细节是某些表上有触发器。

7
在SQL Server 2005上获取最少的多列的最有效方法是什么?
我要从6列中获取最小值。 到目前为止,我已经找到了三种方法来实现此目的,但是我对这些方法的性能感到担忧,并且想知道哪种方法对性能更好。 第一种方法是使用大写语句。这是一个包含3列的示例,基于上面链接中的示例。我的案例陈述将更长,因为我将查看6列。 Select Id, Case When Col1 <= Col2 And Col1 <= Col3 Then Col1 When Col2 <= Col3 Then Col2 Else Col3 End As TheMin From MyTable 第二种选择是将UNION运算符与多个select语句一起使用。我将其放在接受Id参数的UDF中。 select Id, dbo.GetMinimumFromMyTable(Id) from MyTable 和 select min(col) from ( select col1 [col] from MyTable where Id = @id union …

4
SSD是否会降低数据库的实用性
我今天只听说过罗伯特·马丁(Robert Martin),看来他是软件界的佼佼者,所以我的意思不是要让我的头衔看起来像是点击诱饵,或者是我在他口中吐槽,但这仅仅是我以有限的经验和理解来解释我从他那里听到的信息。 我今天正在观看视频(关于软件体系结构),在Robert C. Martin的演讲中,在视频的后半部分,数据库主题是主要焦点。 根据我对他所说内容的理解,似乎他在说固态硬盘会降低数据库的实用性(相当可观)。 要解释我是如何进行这种解释的: 他讨论了使用HDD /旋转磁盘如何缓慢地检索数据。但是,这些天我们使用SSD。他以“ RAM即将到来”开始,然后继续提及RAM磁盘,但随后说他不能称其为RAM磁盘,因此只能说RAM。因此对于RAM,我们不需要索引,因为每个字节花费相同的时间来获取。(本段由我解释) 因此,他建议使用RAM(例如计算机内存中的内存)来代替数据库(因为这就是我解释他的声明的意思)没有任何意义,因为这就像说所有记录在应用程序的生命周期内都是在内存中处理的(除非您根据需要从磁盘文件中提取) 因此,我求助于RAM,他的意思是SSD。因此,在那种情况下,他说固态硬盘会降低数据库的实用性。他甚至说:“如果我是Oracle,我会感到害怕。我之所以存在的根本基础正在消失。” 从我对SSD的了解很少,不像HDD那样需要O(n)寻道时间(我认为),SSD接近O(1)或几乎是随机的。因此,他的建议对我来说很有趣,因为我从未想过。几年前,当我第一次被介绍给数据库时,一位教授描述了常规文件系统所没有的好处,我得出结论,数据库的主要作用本质上是一个索引很高的文件系统(以及优化,缓存,并发访问,等等),因此,如果SSD中不需要索引,这种方法会使数据库的使用率降低。 不管怎么说,以我是新手开头,我很难相信它们变得没有用,因为每个人仍然使用DBs作为其应用程序的主要观点,而不是纯文件系统,并且觉得他过于简化了。数据库的作用。 注意:我一直观察到最后,以确保他没有说不同的话。 供参考:42 : 22是整个数据库主题出现的时间, 43:52是他以“为什么还要拥有数据库”开始的时间 这个答案确实表明SSD大大提高了DB的速度。 此问题询问如何更改优化。 对于TL; DR,我的问题是,服务器市场上广泛使用SSD的出现(无论即将到来还是已经发生)是否会降低数据库的实用性? 似乎演示者试图传达的是,使用SSD,人们可以将数据存储在磁盘上,而不必担心像旧版HDD以及SSD一样检索数据的速度会很慢。O(1)(我认为)。因此,如果这是真的,那么假设会失去它的优势之一:建立索引,因为拥有索引以缩短查找时间的优势已荡然无存。

2
为什么SELECT *比SELECT foo快很多?
考虑一个值和哈希表,如下所示: +------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | val | char(9) | NO | | NULL | | | val_hashed | char(50) | YES | | NULL | …

3
表分区有何帮助?
我很难掌握表分区的优缺点。我即将开始一个有8个表的项目,其中一个将是主要数据表,其中将包含180-2.6亿条记录。由于将对表进行正确的索引,因此我正在考虑将表记录限制为2000万,这样我就必须创建9-13个表。 但是我不确定如何提高性能,因为它们将位于同一台计算机(32GB RAM)上? 我正在使用MySQL,表将是MyISAM,大表将在id字段上具有索引,并且没有进一步的复杂性,例如全文搜索等。 还请阐明表分区与数据库分区。

3
高效插入具有聚簇索引的表
我有一条SQL语句,将行插入到表中,该表在TRACKING_NUMBER列上具有聚簇索引。 例如: INSERT INTO TABL_NAME (TRACKING_NUMBER, COLB, COLC) SELECT TRACKING_NUMBER, COL_B, COL_C FROM STAGING_TABLE 我的问题是-在SELECT语句中为聚集索引列使用ORDER BY子句是否有帮助,或者ORDER BY子句所需的额外排序会否抵消获得的任何收益?


2
MySQL在磁盘上创建临时表。如何停止?
我们正在运行一个用户当前发现缓慢的网站(Moodle)。我认为我已将问题归结为MySQL在磁盘上创建临时表。我created_tmp_disk_tables在Mysql Workbench服务器管理中观察该变量,并且该数目以大约50个表/秒的速度增加。使用几天后,created_tmp_disk_tables> 100k。此外,似乎没有释放内存。使用率一直在增加,直到系统变得几乎无法使用为止,我们必须重新启动MySQL。我几乎每天都需要重新启动它,首先要使用大约30-35%的可用内存,然后以80%的时间结束一天。 我在数据库中没有斑点,也无法控制查询,因此我无法尝试对其进行优化。我还使用了Percona Confirguration向导来生成配置文件,但是my.ini也不能解决我的问题。 问题 我应该怎么做才能阻止MySQL在磁盘上创建临时表?是否需要更改设置?我应该为此增加更多的内存吗? 如何阻止MySQL耗尽内存? 编辑 我启用了slow_queries日志,发现查询SELECT GET_LOCK()记录得很慢。快速搜索显示,我已允许PHP配置(mysqli.allow_persistent = ON)中的持久连接。我关闭了 这降低了MySQL占用内存的速度,尽管它仍在创建临时表。 我还检查了key_buffer size是否足够大。我看着变量key_writes。应该为零。如果不是,请增加key_buffer_size.I为零key_reads和零,key_writes因此我假设key_buffer_size足够大。 我将tmp_table_size和max-heap-table-size增加到1024M,因为created_tmp_disk_tables的增加可能表示表无法容纳在内存中。这没有解决。 参考:http : //www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-temporary-tables/ 编辑2 如果sort_merge_passes在SHOW GLOBAL STATUS输出中看到每秒很多,则可以考虑增加该sort_buffer_size值。我sort_merge_passes一个小时有2个,所以我认为sort_buffer_size足够大了。 参考:Mysql手册 sort_buffer_size 编辑3 我已经按照@RolandoMySQLDBA的建议修改了排序和联接缓冲区。结果显示在下表中,但我认为created_tmp_tables_on_disk仍然很高。我更改了值并检查created_tmp_tables_on_disk了一天(8h)后并计算平均值后,重新启动了mysql服务器。还有其他建议吗?在我看来,有些东西不能放入某种容器中,但是我无法弄清楚它到底是什么。 +---------------------+-------------+-------------+--------------------+ | Tmp_table_size, | Sort_buffer | Join_buffer | No of created | | max_heap_table_size | | | tmp_tables on disk | +---------------------+-------------+-------------+--------------------+ …

2
如何正确执行MySQL烘烤?
我想针对一些其他分支(例如Percona服务器,MariaDB以及可能还有其他一些)进行性能测试(又称烘烤)MySQL服务器rpm。我希望通过提出这个问题,我可以更好地理解设置适当的性能测试的方法。我计划使用sysbench来运行我的实际测试,但是我可以接受任何东西。 我应该采取什么步骤来确保测试结果一目了然,并且只有RDBMS是变体? 我从哪里开始? 如何评估结果? 你能给我什么建议?

1
带日期的索引优化
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 我在PostgreSQL 9.0.8中有一个很大的对象表(15M +行),我想查询该表中的过时字段。 我想将查询除以数百万,以实现可伸缩性和并发性,并且我想获取几天前带有update_at字段的所有数据。 我已经在100万个ID上尝试了许多索引和查询,但是使用Heroku的Ronin硬件在100秒内似乎无法获得性能。 我正在寻找我没有试图使其尽可能高效的建议。 尝试#1 EXPLAIN ANALYZE SELECT count(*) FROM objects WHERE (date(updated_at)) < (date(now())-7) AND id >= 5000001 AND id < 6000001; INDEX USED: (date(updated_at),id) 268578.934 ms 尝试#2 EXPLAIN ANALYZE SELECT count(*) FROM objects WHERE ((date(now()) - (date(updated_at)) > …

4
什么是对表进行大的更改更好的方法:每次都删除或插入,或者存在UPDATE?
我正在做一个项目,每天需要在一张桌子中更改约36000条记录。我想知道什么会更好地执行: 删除行并插入新行,或者 更新现有的行 对我来说,删除所有行并插入新行比较容易,但是如果这将使表和索引碎片化并影响性能,那么我希望尽可能进行更新并仅在必要时删除/插入。 这将是每晚的服务,我不希望提高流程本身的速度。我更关注针对该表的查询的性能,总体而言,我已经有8900万条记录,以及该每晚过程将如何影响它。 我应该删除/插入记录,还是应该在每晚过程中更新现有记录(如果可能)?

1
访问相同的LOB数据时逻辑读取不同
这是三个读取相同数据,但报告逻辑读取非常不同的简单测试: 设定 下面的脚本创建一个包含100个相同行的测试表,每个表包含一个xml列,其中包含足够的数据以确保其存储在行外。在我的测试数据库中,每行生成的xml的长度为20204字节。 -- Conditional drop IF OBJECT_ID(N'dbo.XMLTest', N'U') IS NOT NULL DROP TABLE dbo.XMLTest; GO -- Create test table CREATE TABLE dbo.XMLTest ( ID integer IDENTITY PRIMARY KEY, X xml NULL ); GO -- Add 100 wide xml rows DECLARE @X xml; SET @X = ( SELECT TOP (100) …

6
如何有效地检查多个列上的EXISTS?
这是我定期遇到的一个问题,尚未找到一个好的解决方案。 假设下面的表结构 CREATE TABLE T ( A INT PRIMARY KEY, B CHAR(1000) NULL, C CHAR(1000) NULL ) 要求是确定可为空的列中的任何一个B或C实际上是否包含任何NULL值(以及是否包含任何值)。 还要假设该表包含数百万行(并且没有可用的列统计信息,因为我对此类查询的更通用解决方案感兴趣)。 我可以想到几种解决方法,但都有缺点。 两个单独的EXISTS语句。这样的好处是,一旦NULL找到a,查询就可以立即停止扫描。但是,如果两列实际上都不包含,NULL则将进行两次完整扫描。 单一汇总查询 SELECT MAX(CASE WHEN B IS NULL THEN 1 ELSE 0 END) AS B, MAX(CASE WHEN C IS NULL THEN 1 ELSE 0 END) AS C FROM T 这可能会同时处理两个列,因此最糟糕的情况是一次完整扫描。缺点是,即使NULL在查询的两个很早就在两列中都遇到了a …

2
如何知道何时/是否索引过多?
时不时地运行Microsoft SQL Server Profiler,它建议我创建一系列新的索引和统计信息(“ ... 97%的预期改进...”)。 据我了解,每个增加的索引都可以使SQL SELECT查询更快,但由于必须调整索引,因此SQL UPDATE或SQL 查询的速度也会INSERT变慢。 我想知道的是,什么时候会有“太多”的索引/统计信息? 也许对此没有明确的答案,但有一些经验法则。

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.