Questions tagged «performance»

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

2
如果EXISTS花费的时间比嵌入的select语句长
当我运行以下代码时,需要22.5分钟的时间,并且需要进行1.06亿次读取。但是,如果我自己仅运行内部select语句,则只需15秒即可完成264k次读取。附带说明,select查询不返回任何记录。 知道为什么IF EXISTS它会使它运行更长的时间并进行更多的读取吗?我也将select语句更改为do,SELECT TOP 1 [dlc].[id]并在2分钟后将其杀死。 作为临时解决方案,我将其更改为执行count(*)并将该值分配给变量@cnt。然后它做一个IF 0 <> @cnt声明。但是我认为EXISTS会更好,因为如果select语句中返回了记录,则一旦找到至少一条记录,它将停止执行扫描/查找,而count(*)将会完成整个查询。我想念什么? IF EXISTS (SELECT [dlc].[ID] FROM TableDLC [dlc] JOIN TableD [d] ON [d].[ID] = [dlc].[ID] JOIN TableC [c] ON [c].[ID] = [d].[ID2] WHERE [c].[Name] <> [dlc].[Name]) BEGIN <do something> END

1
在某些情况下,在JOIN子句中使用构造可以引入优化障碍吗?
引起我注意的是,查询子句中的USING构造(而不是ON)在某些情况下可能会引入优化障碍。FROMSELECT 我的意思是这个关键词: 选择 * 从一个 加入b 使用(a_id) 仅在更复杂的情况下。 背景:此评论到这个问题。 我用这个了很多,从来没有发现过这么远。我对一个展示效果或进一步信息的链接的测试案例非常感兴趣。我的搜索工作空虚。 USING (a_id)与替代连接子句相比,完美的答案是显示性能较差的测试用例ON a.a_id = b.a_id- 如果这确实可能发生。

2
按列排序应该有索引吗?
我在表中添加了用于搜索结果的索引。我按ASC或DESC顺序显示结果。所以那列应该有索引吗?我在那张桌子上还有2个索引。对该列建立索引或不建立索引会对性能产生怎样的影响?

4
是否应向VARCHAR列添加任意长度限制?
根据PostgreSQL的文档VARCHAR,VARCHAR(n)和之间没有性能差异TEXT。 我应该在名称或地址列中添加任意长度限制吗? 编辑:不是欺骗: 当所有值均为36个字符时,使用char vs varchar可以使索引查找明显更快 我知道这种CHAR类型是过去的遗迹,我不仅对性能感兴趣,而且对诸如Erwin的其他利弊也很感兴趣。

1
在每个T-SQL语句之后执行
在每个SQL语句之后使用GO语句的背后原因是什么?我了解GO表示批处理已结束,并且/或者允许声明声誉,但是在每个声明之后使用它有什么优势。 我只是很好奇,因为很多Microsoft文档等都在每次声明后开始使用它,或者也许我刚刚开始注意到。 还有什么被认为是最佳实践?

4
分配更多的CPU和RAM后,SQL Server的性能降低
我们在虚拟Windows 2008 R2服务器上运行SQL Server 2008 R2(10.50.1600)。将CPU从1核升级到4,将RAM从4 gb升级到10 gb后,我们注意到性能会变差。 我看到一些观察结果: 现在,运行时间少于5秒的查询现在耗时200秒以上。 使用sqlservr.exe作为罪魁祸首将CPU固定在100。 具有460万行的表上的select count(*)耗时90秒。 服务器上运行的进程没有更改。唯一的变化是增加了cpu和ram。 其他sql服务器具有静态分页文件,该服务器设置为可单独管理该文件。 有人遇到过这个问题吗? Per sp_BlitzErik,我跑了 EXEC dbo.sp_BlitzFirst @SinceStartup = 1; 给我这些结果。

3
CPU性能与数据库服务器相关吗?
这是一个纯粹的理论问题。假设我有一个部署在多台服务器上的应用程序。 负载均衡器 多个/可扩展的应用程序服务器 一台(单个)数据库服务器(目前) 在前两个部分,我确实知道要寻找什么。但是数据库服务器呢?我应该寻找哪种硬件? CPU频率与数据库服务器相关吗? 多个核心CPU相关吗? RAM比CPU更重要吗? PS:假设所选数据库是MySQL或PostgreSQL。

5
为什么InnoDB 100x上的简单SELECT速度比MyISAM慢?
我有一个很烦人的问题。我想使用INNODB作为我的主要数据库引擎,而放弃MyISAM,因为我需要前者使用galera-cluster来实现冗余。 我将newbb_post表复制(描述如下)到一个名为的新表中,newbb_innopost并将其更改为InnoDB。这些表当前5,390,146每个都有条目。 在新启动的数据库上运行这些选择(因此此时不涉及缓存!),该数据库会产生以下结果(省略完整的输出,请注意,我什至不要求数据库对结果进行排序): 从newbb_post中选择post.postid,post.attach作为post,而post.threadid = 51506; 。 。 | 5401593 | 0 | | 5401634 | 0 | + --------- + -------- + 设置62510行(0.13秒) 从newbb_innopost中选择post.postid,post.attach作为post,而post.threadid = 51506; 。 。 | 5397410 | 0 | | 5397883 | 0 | + --------- + -------- + 设置62510行(1分22.19秒) 0.13秒至86.19秒(!) 我想知道为什么会这样。我确实在这里阅读了有关InnoDB的Stackexchange的一些答案,并且有人建议将innodb_buffer_pool大小增加到已安装RAM的80%。这不会解决问题,对特定ID的初始查询将至少花费50倍以上的时间,并使整个Web服务器停滞不前,从而对数据库进行连接和查询。之后可能会启动缓存/缓冲区,但是此数据库中有超过100.000个线程,因此很有可能缓存将永远无法容纳要服务的所有相关查询。 上面的查询很简单(没有连接),并且使用了所有键: 从newbb_innopost解释选择post.postid,post.attach作为post在哪里post.threadid = …

1
XML索引的性能非常奇怪
我的问题基于此:https : //stackoverflow.com/q/35575990/5089204 为了给出答案,我做了以下测试场景。 测试场景 首先,我创建一个测试表并用100.000行填充它。一个随机数(0到1000)应导致每个随机数约100行。此数字放入varchar列中,并作为XML中的值。 然后,我像OP那样进行呼叫,需要使用.exist()和.nodes()进行第二次调用,但是第二步的优势不大,但是两者都需要5到6秒钟。实际上,我进行了两次调用:第二次以交换顺序进行,搜索参数略有变化,并使用“ // item”而不是完整路径,以避免通过缓存的结果或计划产生误报。 然后创建一个XML索引并执行相同的调用 现在-真正让我惊讶的是!- .nodes具有完整路径的速度比以前(9秒)要慢得多,但是.exist()降低到半秒,而具有完整路径的时间甚至可以降低到约0.10秒。(同时.nodes()具有短的路径比较好,但仍远远落后于.exist()) 问题: 我自己的测试简而言之:XML索引会极大地破坏数据库。它们可以极大地加快处理速度(例如,编辑2),但也会降低查询速度。我想了解它们的工作原理...什么时候应该创建XML索引?为什么.nodes()有了索引会比没有索引更糟糕?如何避免负面影响? CREATE TABLE #testTbl(ID INT IDENTITY PRIMARY KEY, SomeData VARCHAR(100),XmlColumn XML); GO DECLARE @RndNumber VARCHAR(100)=(SELECT CAST(CAST(RAND()*1000 AS INT) AS VARCHAR(100))); INSERT INTO #testTbl VALUES('Data_' + @RndNumber, '<error application="application" host="host" type="exception" message="message" > <serverVariables> <item name="name1"> <value string="text" …

6
如何尽可能快地更新MySQL单个表中的1000万行以上?
对大多数表使用MySQL 5.6和InnoDB存储引擎。InnoDB缓冲池大小为15 GB,Innodb DB +索引约为10 GB。服务器具有32GB RAM,并且正在运行Cent OS 7 x64。 我有一张大表,其中包含大约一千万条记录。 我每24小时从远程服务器获取一个更新的转储文件。该文件为csv格式。我无法控制该格式。该文件约为750 MB。我尝试将数据逐行插入MyISAM表中,这花了35分钟。 我只需要从文件中取出10-12行中的每行3个值,然后在数据库中更新它。 实现这样的最佳方法是什么? 我需要每天这样做。 当前Flow是这样的: mysqli_begin_transaction 逐行读取转储文件 逐行更新每个记录。 mysqli_commit 以上操作大约需要30-40分钟才能完成,在执行此操作的同时,还有其他更新正在进行中 超过了锁定等待超时;尝试重新启动事务 更新1 使用加载新表中的数据LOAD DATA LOCAL INFILE。在MyISAM中,花38.93 sec了7分钟5.21秒,而在InnoDB中,花了7分钟。然后我做了: UPDATE table1 t1, table2 t2 SET t1.field1 = t2.field1, t1.field2 = t2.field2, t1.field3 = t2.field3 WHERE t1.field10 = t2.field10 Query OK, …

3
索引VARCHAR列是一个好主意/方法吗?
我们正在使用PostgreSQL v8.2.3。 有涉及的表:EMPLOYEE和EMAILLIST。 Table 1: EMPLOYEE (column1, column2, email1, email2, column5, column6) Table 2: EMAILLIST (email) 2个表以这种方式连接,如果EMPLOYEE.EMAIL1或EMPLOYEE.EMAIL2没有匹配的条目,则将返回这些行。 SELECT employee.email1, employee.email2, e1.email IS NOT NULL AS email1_matched, e2.email IS NOT NULL AS email2_matched FROM employee LEFT JOIN emaillist e1 ON e1.email = employee.email1 LEFT JOIN emaillist e2 ON e2.email = employee.email2 …

3
内联变量时,为什么SQL Server使用更好的执行计划?
我有一个要优化的SQL查询: DECLARE @Id UNIQUEIDENTIFIER = 'cec094e5-b312-4b13-997a-c91a8c662962' SELECT Id, MIN(SomeTimestamp), MAX(SomeInt) FROM dbo.MyTable WHERE Id = @Id AND SomeBit = 1 GROUP BY Id MyTable 有两个索引: CREATE NONCLUSTERED INDEX IX_MyTable_SomeTimestamp_Includes ON dbo.MyTable (SomeTimestamp ASC) INCLUDE(Id, SomeInt) CREATE NONCLUSTERED INDEX IX_MyTable_Id_SomeBit_Includes ON dbo.MyTable (Id, SomeBit) INCLUDE (TotallyUnrelatedTimestamp) 当我完全按照上面的描述执行查询时,SQL Server将扫描第一个索引,从而导致189,703逻辑读取和2-3秒的持续时间。 当我内联@Id变量并再次执行查询时,SQL Server将查找第二个索引,从而导致仅104次逻辑读取和0.001秒的持续时间(基本上是即时的)。 我需要变量,但是我希望SQL使用好的计划。作为一个临时解决方案,我在查询上添加了索引提示,查询基本上是即时的。但是,我尽量避免使用索引提示。我通常假设如果查询优化器无法完成其工作,那么我可以做一些事情(或停止做些事情)来帮助它,而无需明确告诉它该做什么。 …

1
当所有值均为36个字符时,使用char vs varchar可使索引查找明显更快
我有一个旧式架构(免责声明!),它对所有表(有很多)的主键使用基于哈希的生成ID。这样的ID的示例是: 922475bb-ad93-43ee-9487-d2671b886479 改变这种方法没有希望,但是索引访问的性能很差。撇开原因,这可能是无数的,有一件事我注意到,似乎不太理想-尽管是长度正好36个字符的所有许多表中的所有ID值,列类型是varchar(36),不是 char(36)。 除了将每个索引页的条目数量增加很少之外,将列类型更改为固定长度是否会char(36)带来任何显着的索引性能优势? 即在处理固定长度类型时,postgres的执行速度是否比可变长度类型快? 请不要提及微不足道的存储节省-与更改色谱柱所需的手术相比,这已不再重要。

4
CPU时钟速度与CPU核心数量之间的关系-更高的GHz,还是SQL Server使用更多的核心?
我们开始为VMware中的SQL Server 2016节点的虚拟群集提供一组物理服务器。我们将利用企业版许可证。 我们计划设置6个节点,但是关于在CPU时钟速度与CPU核心数之间提供物理服务器的理想方式尚有争议。 我知道这很大程度上取决于交易量和存储的数据库数量以及其他特定于软件的因素,但是建议使用一般经验法则吗? 例如,双8核3.2 GHz物理服务器(16核)是否比双16核2.6 GHz服务器(32核)更优先? 有谁遇到过进一步研究此类主题的白皮书?


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.