Questions tagged «performance»

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

1
为什么在我索引列时此sqlite查询要慢得多?
我有一个带两个表的sqlite数据库,每个表有50,000行,其中包含(假)人的名字。我构建了一个简单的查询,以找出两个表共有的名称(给定名称,中间名缩写,姓氏): select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial; 当除了主键之外没有索引(与该查询无关)时,它将快速运行: [james@marlon Downloads] $ time sqlite3 generic_data_no_indexes.sqlite "select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;" 131 real 0m0.115s user 0m0.111s sys 0m0.004s 但是,如果我将索引添加到每个表的三列中(总共六个索引): CREATE INDEX `idx_uk_givenname` ON `fakenames_uk` (`givenname` ) //etc. …

2
如何在不到一秒钟的时间内跟踪发生的阻塞-SQL Server
我正在尝试解决不到一秒钟的阻塞问题。OLTP应用程序非常敏感,根据约定的SLA,某些事务的响应时间必须小于200ms。我们在新代码发行版中遇到了一些锁升级问题,可以通过减少更新中的批处理大小来解决这些问题。即使批处理量很小,我们也怀疑新sp阻塞了OLTP事务更新的同一行。 我需要找到被阻塞的会话及其等待的资源。根据我的理解,“阻塞的过程阈值”可以设置为至少1秒,因此这不会捕获阻塞。 我正在试验wait_info和wait_completed x事件。 还有其他方法可以跟踪此问题。谢谢

1
为什么使用CASE,多个COUNT比一个SUM快?
我想知道以下两种方法中哪一种速度更快: 1)三COUNT: SELECT Approved = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Approved'), Valid = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Valid'), Reject = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Reject') 2)SUM与FROM-clause: SELECT Approved = SUM(CASE WHEN Status = 'Approved' THEN 1 ELSE 0 END), …

2
扩展PostgreSQL触发器
Postgres如何触发机制扩展? 我们有大型的PostgreSQL安装,并且我们正在尝试使用日志表和TRIGGER来实现基于事件的系统。 基本上,我们想为要通知UPDATE / INSERT / DELETE操作的每个表创建一个TRIGGER。触发该触发器后,它将执行一个函数,该函数将简单地将新行(对事件进行编码)追加到日志表中,然后我们将从外部服务中进行轮询。 在开始使用Postgres TRIGGER之前,我们想知道它们如何扩展:在单个Postgres安装中可以创建多少个触发器?它们会影响查询性能吗?之前有人尝试过吗?

1
对SOS_SCHEDULER_YIELD等待进行故障排除
在运行我们的企业ERP(Dynamics AX 2012)时,我注意到我们的生产环境似乎比我们的开发系统慢得多。 在运行跟踪的同时在开发和生产环境中执行相同的活动后,我确认与开发相比,SQL查询在我们的生产环境中执行得非常慢(平均慢10到50倍)。 最初,我将其归因于负载,并在下班时间在生产环境上重新运行了相同的活动,并在跟踪中找到了相同的结果。 我在SQL Server中清除了等待统计信息,然后让服务器在其正常生产负载下运行了一段时间,然后运行了以下查询: WITH [Waits] AS (SELECT [wait_type], [wait_time_ms] / 1000.0 AS [WaitS], ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS], [signal_wait_time_ms] / 1000.0 AS [SignalS], [waiting_tasks_count] AS [WaitCount], 100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage], ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum] FROM sys.dm_os_wait_stats …

4
好,坏或无所谓:WHERE 1 = 1
给定有关reddit的问题,我清理了查询以指出问题在查询中的位置。我首先使用逗号WHERE 1=1,并使修改查询更容易,所以我的查询通常以如下方式结束: SELECT C.CompanyName ,O.ShippedDate ,OD.UnitPrice ,P.ProductName FROM Customers as C INNER JOIN Orders as O ON C.CustomerID = O.CustomerID INNER JOIN [Order Details] as OD ON O.OrderID = OD.OrderID INNER JOIN Products as P ON P.ProductID = OD.ProductID Where 1=1 -- AND O.ShippedDate Between '4/1/2008' And '4/30/2008' And P.productname …

4
在使用InnoDB引擎输入数次演出后,MySQL LOAD DATA INFILE速度降低了80%
我正在通过LOAD DATA INFILE加载100GB文件。我在MyISAM上取得了成功,几个小时就完成了。 我现在正在尝试使用InnoDB。负载以超过10MB / sec的速度快速启动(监视表文件的增长file_per_table是否已打开)。 但是,在大约5GB的数据传输之后,它会降低到2-4MB /秒的范围,而当我超过20GB时,它的传输速度会降低到2MB /秒左右。 InnoDB缓冲池的大小为8G。在运行LOAD DATA INFILE命令之前,我已经完成了以下操作: SET @@session.sql_log_bin=0; SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; alter table item_load disable keys; //Run LOAD DATA INFILE.... 我看不出它启动良好并随着时间的推移变慢的原因。 另外,使用相同的设置,我使用InnoDB和MyISAM和5GB测试数据集对表运行了相同的LOAD DATA INFILE命令,MyISAM快20倍: InnoDB: mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load; Query OK, 2630886 rows affected, …

4
是否可以在具有数百万行的狭窄表上提高查询性能?
我有一个查询,目前平均需要2500毫秒才能完成。我的表很窄,但是有4400万行。我必须选择哪些选项来提高性能,或者说它达到了它的理想水平? 查询 SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'; 桌子 CREATE TABLE [dbo].[Heartbeats]( [ID] [int] IDENTITY(1,1) NOT NULL, [DeviceID] [int] NOT NULL, [IsPUp] [bit] NOT NULL, [IsWebUp] [bit] NOT NULL, [IsPingUp] [bit] NOT NULL, [DateEntered] [datetime] NOT NULL, CONSTRAINT [PK_Heartbeats] PRIMARY KEY CLUSTERED ( [ID] …

3
测试存储过程的可伸缩性
我有一个电子邮件应用程序,将在每个页面加载时调用该应用程序以将给定用户的新消息数传送到UI。我在数据库级别测试的东西有一些变体,但是所有这些都通过存储的proc调用抽象出来。 我试图猛击数据库以查看断点(每秒请求数)。 简而言之,我有一个表,如此userId,newMsgCount,以及对userId的聚集索引。SQL应该每秒能够处理数百或数千个此类响应。我认为落后者是我的.NET应用程序。 我怎样才能使它成为一个很好的测试,以基于SQL性能获得测试结果? 是否有为此工具,我可以为其提供存储的proc名称和参数以将其打包到数据库中? 我想看看数据库是否可以返回分钟。每秒250个响应。

3
SQL Server-临时表与物理表
在我的工作场所中,正在逐渐摆脱使用#temp表,而是使用具有SPID的永久物理表的趋势。只要以前将INSERTINSERT插入#temp表中,现在INSERT INTO dbo.MyPermanentTable (SPID, ...) VALUES (@@SPID, ...)都需要一个- DELETE FROM dbo.MyPermanentTable WHERE SPID = @@SPID在存储过程开始时加上一堆语句。此外,不用说,在使用这些“用于存储临时数据的永久性表”的地方,都必须小心包含一个WHERE SPID = @@SPID。 采取这种做法的逻辑是,它将提高运行查询的服务器的整体性能(通过减少tempdb中的I / O和争用)。由于多种原因,我并不热衷于这种方法-这种方法很丑陋,潜在危险,而且似乎很可能损害那些使用新方案的查询的性能。 有没有人有这种消除#temp表的方法或类似方法的经验?

2
SQL Server 2016的奇怪性能问题
我们在VMware虚拟机中运行SQL Server 2016 SP1的单个实例。它包含4个数据库,每个数据库用于一个不同的应用程序。这些应用程序都位于单独的虚拟服务器上。它们都没有在生产中使用。但是,测试应用程序的人员正在报告性能问题。 这些是服务器的统计信息: 128 GB RAM(SQL Server最大110GB内存) 4核@ 4.6 GHz 10 GBit网络连接 所有存储均基于SSD 程序文件,日志文件,数据库文件和tempdb位于服务器的单独分区上 阿斯 用户正在通过基于C ++的ERP应用程序执行单屏访问。 当我ostress使用许多小型查询或大型查询对Microsoft的SQL Server进行压力测试时,我将获得最佳性能。唯一的限制是客户,因为他不能足够快地回答。 但是,当几乎没有用户时,SQL Server几乎什么也不做。然而,人们必须永远等待以保存应用程序中的所有内容。 根据Paul Randal的“ 告诉我哪里疼 ”查询,所有等待事件中有50%是ASYNC_NETWORK_IO。 这可能意味着网络问题,或者应用程序服务器或客户端的性能问题。这些都无法最大程度地远程使用其资源。大多数情况下,所有计算机(客户端,应用服务器,数据库服务器)上的CPU大约占26%。 网络连接的延迟约为1-3ms。在正常使用该应用程序期间,数据库服务器的IO最高写入速度为20MB / s(平均为7-9MB / s)。当我进行压力测试时,最高速度达到5GB / s。 对于我们的ERP系统数据库,缓冲区高速缓存大小为60GB,对于我们的财务软件,为20GB,对于质量保证软件,为1GB,对于文档归档系统,为3GB。 我授予了SQL Server帐户使用即时文件初始化的权利。丝毫没有提高性能。 在正常使用期间,页面预期寿命约为15k +。在预期的重压力测试结束时,该值下降至.05k左右。批处理/秒约为2-8k,具体取决于工作负载。 我会说ERP应用程序写得不好,但是我不能,因为所有应用程序都受影响。即使工作量最少。 但是我无法查明是什么原因造成的。是否有任何提示,提示教程,应用程序,最佳/最差实践文档或其他有关此问题的想法? 这些是来自的结果sp_BlitzFirst: 我跑了600秒。我在工作量很大的应用程序中启动了它。是1/3的时间ASYNC_NETWORK_IO。我还测试与网络连接NTttcp,PsPing,ipferf3,和pathping。没什么不寻常的。响应时间最大3毫秒,平均0.3毫秒。吞吐量约为1000 MB / s。 我的调查总是导致ASYNC_NETWORK_IOwaitstat排名第一。 我们调查了Large-Receive-Offload在VMware 中禁用该功能的结果。我们仍在测试中,但结果似乎不一致。我们的第一个“基准测试”持续了19分钟(最高结果是13分钟,只有当应用程序在具有SQL …

1
优化大型数据库查询(25+百万行,使用max()和GROUP BY)
我使用的是Postgres 9.3.5,并且数据库中有一个大表,目前它有2500万行,而且它往往会迅速增大。我正在尝试通过一个简单的查询来选择特定的行(所有行都unit_id只有最新的行unit_timestamp),例如: SELECT unit_id, max(unit_timestamp) AS latest_timestamp FROM all_units GROUP BY unit_id; 没有任何索引,此查询大约需要35秒才能执行。使用定义的索引(CREATE INDEX partial_idx ON all_units (unit_id, unit_timestamp DESC);),查询时间缩短到(仅)19秒左右。 我想知道是否有可能在更短的时间内(例如几秒钟)执行我的查询,如果可以,我应该采取什么步骤来进一步优化它? 我的表结构转储如下所示: CREATE TABLE "all_units" ( "unit_id" int4 NOT NULL, "unit_timestamp" timestamp(6) NOT NULL, "lon" float4, "lat" float4, "speed" float4, "status" varchar(255) COLLATE "default" ) ALTER TABLE "all_units" ADD PRIMARY …

2
高效的查询,以从大表中获取每个组的最大价值
给定表: Column | Type id | integer latitude | numeric(9,6) longitude | numeric(9,6) speed | integer equipment_id | integer created_at | timestamp without time zone Indexes: "geoposition_records_pkey" PRIMARY KEY, btree (id) 该表有2000万条记录,相对而言,这不是一个很大的记录。但这会使顺序扫描变慢。 如何获得max(created_at)每个记录的最后一条记录()equipment_id? 我已经尝试了以下两个查询,并阅读了有关该主题的许多答案的几种变体: select max(created_at),equipment_id from geoposition_records group by equipment_id; select distinct on (equipment_id) equipment_id,created_at from geoposition_records order by …

4
使用GROUP BY和ORDER BY对大表进行慢查询
我有一张桌子,上面有720万个元组,看起来像这样: table public.methods column | type | attributes --------+-----------------------+---------------------------------------------------- id | integer | not null DEFAULT nextval('methodkey'::regclass) hash | character varying(32) | not null string | character varying | not null method | character varying | not null file | character varying | not null type | character varying | …

3
查询期间从磁盘检索到什么?
很简单的问题,可能在某个地方回答了,但是我似乎无法为Google形成正确的搜索问题... 在特定表的子集上进行查询时,该表中的列数是否会影响查询的性能? 例如,如果表Foo有20列,但是我的查询只选择了其中的5列,那么拥有20列(相对于说10列)是否会影响查询性能?为简单起见,假设这5列中包含WHERE子句中的任何内容。 除了操作系统的磁盘缓存之外,我还担心Postgres的缓冲区缓存的使用。我对Postgres的物理存储设计非常了解。表存储在多页中(默认每页大小为8k),但我不太了解如何从那里排列元组。PG是否足够聪明,仅从磁盘中获取包含这5列的数据?

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.