Questions tagged «performance»

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

3
可怜的基数估计使INSERT无法进行最少的记录?
为什么第二个INSERT语句比第一个语句慢5倍? 从生成的日志数据量来看,我认为第二个不符合最小日志记录的条件。但是,《数据加载性能指南》中的文档指出,两个插入都应该能够被最小限度地记录。因此,如果最小日志记录是关键性能差异,那么为什么第二个查询不符合最小日志记录的条件?可以采取什么措施来改善这种情况? 查询#1:使用INSERT ... WITH(TABLOCK)插入5MM行 考虑以下查询,该查询将5MM行插入堆中。该查询在中执行1 second并生成64MB事务日志数据,如所报告sys.dm_tran_database_transactions。 CREATE TABLE dbo.minimalLoggingTest (n INT NOT NULL) GO INSERT INTO dbo.minimalLoggingTest WITH (TABLOCK) (n) SELECT n -- Any table/view/sub-query that correctly estimates that it will generate 5MM rows FROM dbo.fiveMillionNumbers -- Provides greater consistency on my laptop, where other processes are running OPTION …

2
我应该使用UUID还是ID
我已经在系统中使用UUID一段时间了,原因有很多,从日志记录到延迟的关联。随着我变得越来越幼稚,我使用的格式发生了变化: VARCHAR(255) VARCHAR(36) CHAR(36) BINARY(16) 当我到达最后一个时BINARY(16),我开始将性能与基本自动递增整数进行比较。测试和结果如下所示,但如果你只是想总结,表示INT AUTOINCREMENT和BINARY(16) RANDOM对数据相同的性能范围高达20万(该数据库已预先填充之前测试)。 最初,我对将UUID用作主键持怀疑态度,确实确实如此,但是我发现这里有潜力创建一个可以同时使用两者的灵活数据库。尽管许多人强调这两种方法的优点,但同时使用这两种数据类型可以消除哪些缺点呢? PRIMARY INT UNIQUE BINARY(16) 这种类型的设置的用例将是表间关系的传统主键,并且具有用于系统间关系的唯一标识符。 我本质上试图发现的是两种方法之间的效率差异。除了所使用的四倍磁盘空间(在添加其他数据后可能几乎可以忽略不计)外,在我看来它们是相同的。 架构: -- phpMyAdmin SQL Dump -- version 4.0.10deb1 -- http://www.phpmyadmin.net -- -- Host: localhost -- Generation Time: Sep 22, 2015 at 10:54 AM -- Server version: 5.5.44-0ubuntu0.14.04.1 -- PHP Version: 5.5.29-1+deb.sury.org~trusty+3 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; …

4
SQL Server上的CPU使用率高-查询速度慢
这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 6年前关闭。 我们的MS SQL Server使用了大约95%的CPU能力。 重新启动服务器(硬件)或重新启动SQL-Service后,使用率为0%,并且在1-3天的过程中缓慢增加。取决于使用了多少。 当超过80%时,每个查询都会非常慢。 我们的网站正在处理大量重大查询,因此其中一些需要45-60秒。重新启动后(CPU使用率低于80%),相同的查询需要11到20秒的时间。 我怎样才能解决这个问题?我已经在线阅读了亲和力掩码可以调整CPU使用率的信息,但亲和力设置已禁用。我不能改变他们。这是因为我只有1个处理器吗? 与查询本身有关的技巧很多,但我们的网站和服务相当庞大,而且变化太多。 它们中的大多数已经非常优化。 即使只花了2秒钟,我也无法继续重启SQL服务,因为我们有一个警报服务,允许人们拨入并记录一条消息,然后将呼叫选定的组并听到记录的消息。 数百个Search and Rescue团队都使用此系统,如果SQL-Service在警报期间重新启动,它将终止,并且不会通知调用它的人员。 我搜索了整个地方,但是除了“亲和力面具”以外,什么都找不到,我无法更改。 必须有一种在不终止当前查询的情况下清除CPU缓存的方法...对吗? SQL: Microsoft SQL Server 11.0.2100.60 OS: Windows Server 2012 x64 Processor: 2.30 GHz RAM: 4.00 GB

3
新服务器上的性能更差
我们一直在使用专用服务器(单四核,6 GB RAM),并且正在迁移到新的专用服务器(2x六核,32 GB RAM)。两者都是Windows Server 2008,SQL Server2008。新服务器的性能比旧的慢服务器稍差。 在测试中,我们的ASP.NET应用程序的运行速度降低了10%-20%。使用STATISTICS IO和STATISTICS TIME运行单个昂贵的查询将显示在新服务器上的运行时间增加了10-20%。SQL查询配置文件在昂贵的查询中显示较高的CPU使用率。 新服务器上的任务管理器显示sqlserver.exe正在消耗22 GB的RAM,但CPU值始终保持很低。 我已经更新了所有统计信息,重建或重新组织了索引等。鉴于我已完成的测试量,执行计划此时应存储在新服务器上。如果有任何缺失的索引(我认为没有),它们会同等地影响新旧服务器。新的具有与旧的相同数据的还原备份。 我曾希望新服务器上的性能会更好,但是负载更值得关注。如果旧服务器即使在负载下也表现更好,那么当新的,性能稍差的服务器必须承担该负载时会发生什么? 我还能在这里错过什么? 编辑:MAXDOP设置为6。 旧服务器在相同的物理驱动器(RAID 10)上具有操作系统,数据库和tempdb。总共4个15k 3 Gb / s 3.5英寸SAS。新服务器具有三个驱动器集:RAID 1上的OS,RAID 10上的数据库,RAID 5上的tempdb。总共9个15K 6 Gb / s 2.5英寸SAS。 旧服务器具有1 x Intel Xeon E5620 2.40 GHz四核8线程(w H / T)。新服务器具有2个Intel Xeon E5-2640 2.5 GHz六核12线程(w H / T)。 编辑2:这是最终分析: …

2
限时降低ORDER BY
我有这个查询: SELECT * FROM location WHERE to_tsvector('simple',unaccent2("city")) @@ to_tsquery('simple',unaccent2('wroclaw')) order by displaycount 我对此感到满意: "Sort (cost=3842.56..3847.12 rows=1826 width=123) (actual time=1.915..2.084 rows=1307 loops=1)" " Sort Key: displaycount" " Sort Method: quicksort Memory: 206kB" " -> Bitmap Heap Scan on location (cost=34.40..3743.64 rows=1826 width=123) (actual time=0.788..1.208 rows=1307 loops=1)" " Recheck Cond: (to_tsvector('simple'::regconfig, unaccent2((city)::text)) …

2
MySQL中触发器与存储过程的性能
关于DBA.StackExchange(触发器在记录上保留修订号的最佳实践是什么?)的一篇文章引发了一个关于MySQL性能的有趣的问题(至少对我来说很有趣)。 上下文是我们要在表中为每个更新的行插入一条记录。在更新该行之前,我们要存储一个先前的值,然后递增其中一列(“版本”列)。 如果我们在触发器中执行此操作,则效果很好。对于MySQL,触发器是逐行的,因此这是一个简单的解决方案。选择表中当前的数据,将其插入日志记录表,然后更新新数据中的“版本”列。 但是,可以将此逻辑移至存储过程。如果这样做,您将执行插入操作,然后增加表中的“版本”列。整个事情将基于设置。 因此,在执行此插入操作时,使用基于集合的存储过程方法或基于触发器的方法会更有效吗? 这个问题是针对MySQL的(因为它具有逐行触发器),尽管它可以应用于其他逐行触发器DBMS。

3
使用LIMIT是否可以提高性能,并且引人注意?
我想了解以下内容。 假设我有一个复杂的查询,假设一个5个表的联接按求和和排序。 抛开对查询本身的任何优化(例如索引等)。使用 是否有任何明显的性能优势LIMIT?我认为必须在应用LIMIT 之前处理所有查询(和结果),因此使用LIMIT检索结果的子集,这是否会带来重大/显着的改进?

1
为SQL Server中的所有连接设置ARITHABORT ON的后果是什么?
因此,我确定SQL Server的行为不稳定是由于.Net SqlClient数据提供程序的默认设置为SET ARITHABORT OFF。话虽如此,我已经阅读了各种文章,讨论了实现此目标的最佳方法。对我来说,我只想采用一种简单的方法,因为SQL Server遭受了麻烦,而且我的查询调优还没有完全跨应用程序(显然,SET在sp中添加不能正常工作)。 在Erland Sommarskog 关于该主题的精彩文章中,他基本上建议通过更改要SET ARITHABORT ON为连接发布的应用程序来采用安全的方法。但是,在dba.stackexchange 问题的此答案中,Solomon Rutzky 提供了实例范围和数据库范围的方法。 在此设置整个实例范围时,我在这里缺少什么后果?正如我所看到的...由于SSMS ON默认情况下已设置了此设置,所以我认为在ON所有服务器范围内都设置此服务器范围没有什么害处。归根结底,我只需要此SQL Server才能执行最重要的任务。

1
在Postgres中优化2000万行的“最新”查询
我的表如下所示: Column | Type | -----------------------+-------------------+ id | integer | source_id | integer | timestamp | integer | observation_timestamp | integer | value | double precision | 索引存在于source_id,timestamp以及timestamp和id(CREATE INDEX timeseries_id_timestamp_combo_idx ON timeseries (id, timeseries DESC NULLS LAST))的组合上 其中有2000万行(好的,有120M,但是有source_id = 1的20M)。它有许多相同的条目,timestamp且有所不同observation_timestamp,描述了一个value发生在timestamp报告或观察到的事件observation_timestamp。例如,明天下午2点预测的温度与今天上午12点预测的温度相同。 理想情况下,此表可以很好地完成一些工作: 批量插入新条目,有时一次插入10万 选择观察到的时间范围内的数据(“一月到三月的温度预测是多少”) 选择从某个点观察到的时间范围内观察到的数据(“如我们在11月1日所想到的,从1月到3月的温度预测如何看待”) 第二个是这个问题的核心。 表中的数据如下所示 id source_id timestamp observation_timestamp …

2
每一批都会导致编译
我们有一个第三方应用程序,它可以批量发送T-SQL语句。 该数据库托管在SQL Server 2016 Enterprise SP1 CU7、16核和256GB内存上。启用即席优化。 这是正在执行的查询的虚拟示例: exec sp_executesql N' IF @@TRANCOUNT = 0 SET TRANSACTION ISOLATION LEVEL SNAPSHOT select field1, field2 from table1 where field1=@1 option(keep plan, keepfixed, loop join) select field3, field4 from table2 where field3=@1 option(keep plan, keepfixed, loop join)', N'@1 nvarchar(6)',@1=N'test' 当我监视数据库并查看批处理/秒和编译/秒时,我注意到它们始终相同。在高负载下,这可以是1000批/秒和1000编译/秒。在平均负载下,有150个批次/秒。 我分析了最近编译的计划的查询缓存: SELECT TOP …

3
为什么将自动更新统计信息设置为False?
作为更广泛的收购项目的一部分,我刚刚继承了大约20个SQL Server实例。我正在评估性能,我不喜欢实施维护计划的方式。 我看到每天进行一揽子索引重建(我可以处理这一问题),并且每天都在手动更新统计信息。 大约一半的数据库已设置为“自动更新统计信息= False”,原因除了我被告知要减少“性能问题”外,其他原因还不清楚。 我一直认为并努力将其设置为True的最佳实践,并认为如果此设置为True,则不需要手动更新。我错了吗? 谁能解释一下将此设置为False会有什么好处,但是每天进行一次手动更新呢? 我应该提到,某些数据库具有很高的事务性(每天有数以百万计的插入,删除,更新),而其他数据库的事务处理率很低,而有些则全部是只读的。尽管没有任何韵律或原因,但关于“自动更新”设置为“否”的信息。好像是彩票。

3
应用程序查询空表
我公司使用的应用程序存在很大的性能问题。我正在研究数据库本身存在许多问题,但是许多问题纯粹与应用程序有关。 在调查中,我发现有数百万个查询命中SQL Server数据库,查询空表。我们大约有300个空表,其中一些表每分钟最多查询100-200次。这些表与我们的业务领域无关,实际上是原始应用程序的一部分,当我的公司与他们签约为我们提供软件解决方案时,供应商并未删除这些原始应用程序。 除了我们怀疑应用程序错误日志中充斥着与此问题相关的错误以外,供应商还向我们保证,应用程序或数据库服务器不会对性能或稳定性造成影响。错误日志泛滥成灾,以至于我们看不到价值超过2分钟的错误来进行诊断。 这些查询的实际成本显然会在CPU周期等方面很低。但是,谁能说出对SQL Server和应用程序有什么影响呢?我怀疑发送请求,确认请求,处理请求,返回请求以及确认应用程序已收到请求的实际机制本身会对性能产生影响。 我们将SQL Server 2008 R2,Oracle Weblogic 11g用于该应用程序。 @ Frisbee-长话短说,我创建了一个包含querytext的表,该表命中了应用程序数据库中的空表,然后对其查询以获取我知道为空的所有表名,并得到了很长的列表。考虑到该应用通常在上午8点至下午6点使用,因此在30天的正常运行时间中,执行次数最高的是270万次执行,因此这些数字更多地集中在运营时间。多个表,多个查询,可能有些通过联接释放,有些则没有。命中率最高(当时为270万)是从一个带有where子句,无联接的空表中进行的简单选择。我希望连接到空表的较大查询可能包括对链接表的更新,但是我将检查并尽快更新此问题。 更新:有1000个查询,执行计数在1043-4622614之间(超过2.5个月)。我将不得不挖掘更多信息以找出缓存计划的产生时间。这只是为了让您了解查询的范围。大多数都相当复杂,有20多个连接。 @ srutzky-是的,我相信会有一个与计划编制时间相关的日期栏,因此您将对此感兴趣,因此我将对其进行检查。我想知道,当SQL Server位于VMware群集上时,线程限制是否会成为一个因素?值得庆幸的是,即将成为专用的Dell PE 730xD。 @Frisbee-对不起,您的回复很晚。正如您所建议的,我使用SQLQueryStress在空表中对24个线程运行了10,000次select *(实际上是240,000次迭代),并立即达到10,000个批处理请求/秒。然后,我在24个线程中减少了1000次,并达到了4,000个批处理请求/秒以下。我还仅在12个线程上尝试了10,000次迭代(因此总共进行了120000次迭代),这产生了持续的6,505批/秒。实际上,对CPU的影响非常明显,在每次测试运行期间,约占CPU总使用量的5-10%。网络等待时间可以忽略不计(例如,工作站上的客户端需要3毫秒),但是对CPU的影响是肯定的,就我而言,这是非常确定的。这似乎归结为CPU使用率和一些不必要的数据库文件IO。每秒总执行次数约为3000次,这比生产中的要多,但是我只测试了数十个这样的查询之一。数百个查询以每分钟300-4000次之间的速率命中空表的最终结果在CPU时间方面不可忽略。所有测试都是针对具有双闪存阵列和256GB RAM,12个现代内核的空闲PE 730xD进行的。 @ srutzky-好主意。默认情况下,SQLQueryStress似乎使用连接池,但是无论如何,我发现,是的,连接池复选框已选中。更新以跟随 @ srutzky-应用程序上的连接池显然未启用-如果已启用,则无法使用。我进行了探查器跟踪,发现对于审计登录事件,连接具有EventSubClass“ 1-Nonpooled”。 RE:连接池-检查了weblogics,发现启用了连接池。针对活着的发现更多痕迹,发现池化迹象没有正确/根本没有: 这是当我对填充的表没有连接的情况下运行单个查询时的样子。异常显示为“与SQL Server建立连接时发生与网络有关或特定于实例的错误。找不到服务器或无法访问该服务器。请验证实例名称正确并且已将SQL Server配置为允许远程连接。 (提供程序:命名管道提供程序,错误:40-无法打开与SQL Server的连接)“请注意批处理请求计数器。在生成异常的时间内对服务器执行ping操作会成功执行ping响应。 更新-两次连续的测试运行,相同的工作量(select * fromEmptyTable),启用/未启用池。CPU使用率略高,故障很多,并且从未超过500个批处理请求/秒。测试显示10,000个批处理/秒,并且在启用池的情况下没有失败,大约400个批处理/秒,然后由于禁用了池而导致很多失败。我想知道这些故障是否与连接可用性不足有关? @srutzky-从sys.dm_exec_connections中选择Count(*); 启用池化:即使在负载测试停止后也始终保持37 禁用池化:11-37,具体取决于是否 在SQLQueryStress 上发生异常,即:当这些低谷出现在Batchs / sec图上时,在SQLQueryStress上发生异常,并且 连接数下降到11,然后逐渐恢复到37当批次开始达到高峰且未发生异常时。非常非常有趣。 两个测试/活动实例上的最大连接数设置为默认值0。 已经检查了应用程序日志并且找不到连接问题,但是由于错误的数量和大小(即:大量的堆栈跟踪错误),只有几分钟的可用日志记录可用。应用程序支持的一位同事建议,发生大量与连接有关的HTTP错误。似乎基于此,由于某种原因,应用程序无法正确地建立连接池,结果服务器反复耗尽连接。我将进一步研究应用日志。我想知道是否有办法从SQL Server方面证明这种情况正在生产中发生? @ …

1
为什么我的Azure SQL Server这么慢?
当前,我们有一个功能很差的虚拟机,并建议迁移到具有更好规格的Azure VM。问题是,即使Azure VM具有更高的规格,它也比原始VM慢得多。 原始服务器是具有2GB内存的2核VM,它也是Web服务器。它正在运行Microsoft SQL Server Web Edition 2008 R2,并且由于该服务器还用于其他用途,因此我们不得不将SQL Server中的最大服务器内存限制为512MB。 新服务器是具有7GB内存的4核VM,仅是数据库服务器。它正在运行Microsoft SQL Server Standard Edition 2008 R2,并且我们没有限制SQL Server可以使用的内存量。 这是在镜像环境中设置的两台服务器之一,但是我正在运行测试的数据库未镜像。目前,该服务器上的其他数据库通信量不大(实际上,在我运行这些测试时,活动监视器未显示其他DB上的活动)。 我确实意识到Azure VM的一个问题是硬盘驱动器是一种网络资源,因此这将成为速度下降的根源,但是即使IO统计数据中显示了0次物理读取,它仍然会变慢。 我已在Azure VM 上遵循此页面上的调优建议,包括剥离磁盘(每个驱动器两个磁盘)并将日志和数据文件放在单独的驱动器上。 我唯一没有做的事情就是启用页面压缩,限制数据库的自动增长以及将SQL Server错误日志和跟踪文件目录移动到数据磁盘。我也没有在旧服务器上做到这一点。 旧服务器没有完成任何调优,并且日志和数据文件位于未分割的同一驱动器上。 当前服务器上的数据库为65 GB(45个数据和20个日志),这太大了,无法传输到新服务器,因此我正在较小的DB(6个数据和13.5日志)上进行测试 这是旧服务器上的结果,CPU time = 1311 ms, elapsed time = 1057 ms.新服务器上CPU time = 1281 ms, elapsed time = 2525 ms. 的结果是。这只是一次运行,但是结果代表了我通常看到的内容。 …

2
获取运行缓慢的查询的统计信息
我的数据库应用程序运行许多不同的查询。我已将其设置log_min_duration_statement为1000。但是记录的查询并不总是很慢,大多数情况下它们仅花费几毫秒。 是否可以获取所有查询的统计信息,并且查询花费的时间多于1000毫秒?

2
MySQL:左外部联接和内部联接之间哪个联接更好
如果所有连接都提供相同的结果,哪个连接比较好执行?例如,我有两个表employees(emp_id,name, address, designation, age, sex)和work_log(emp_id,date,hours_wored)。为了得到一些特定的结果,inner join并left join给出相同的结果。但是,我还有一些疑问,不仅限于这个问题。 在结果值相同的情况下,哪个连接更有效? 申请加入时还必须考虑哪些其他因素? 内部联接和交叉联接之​​间有什么关系吗?

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.