Questions tagged «performance-tuning»

改善数据库应用程序或系统的性能特征。

6
为什么添加TOP 1会显着降低性能?
我有一个相当简单的查询 SELECT TOP 1 dc.DOCUMENT_ID, dc.COPIES, dc.REQUESTOR, dc.D_ID, cj.FILE_NUMBER FROM DOCUMENT_QUEUE dc JOIN CORRESPONDENCE_JOURNAL cj ON dc.DOCUMENT_ID = cj.DOCUMENT_ID WHERE dc.QUEUE_DATE <= GETDATE() AND dc.PRINT_LOCATION = 2 ORDER BY cj.FILE_NUMBER 那给了我可怕的表现(就像从来没有想过要等待它完成一样)。查询计划如下所示: 但是,如果我删除,则会TOP 1得到一个看起来像这样的计划,它会在1-2秒内运行: 在下面更正PK和索引。 该事实TOP 1改变了查询计划并不让我感到吃惊,我只是有点惊讶,这使情况变得更糟了这么多。 注意:我已经阅读了这篇文章的结果,并了解了Row Goaletc 的概念。我很好奇的是如何去改变查询,以便它使用更好的计划。目前,我正在将数据转储到临时表中,然后从中提取第一行。我想知道是否有更好的方法。 编辑对于在事实结束后仍在阅读本文的人,这里还有一些其他信息。 Document_Queue-PK / CI是D_ID,它具有约5k行。 Correspondence_Journal-PK / CI为FILE_NUMBER,CORRESPONDENCE_ID,具有约140万行。 当我开始时,没有其他索引。我最后在Correspondence_Journal(Document_Id,File_Number)上写了一个

2
触发器每次都编译吗?
我们正在对CPU利用率高的服务器进行故障排除。在发现查询并非真正引起查询之后,我们开始研究编译。 性能监视器显示少于50次编译/秒和少于15次重新编译/秒。 在运行XE会话以查找编译之后,我们每秒看到数千个编译。 该系统正在使用触发器来审核更改。大多数编译是由于触发器引起的。触发器参考sys.dm_tran_active_transactions。 我们的第一个想法是,在触发器中引用DMV会使它每次都编译,或者仅此特定DMV会导致它编译。因此,我开始测试该理论。它确实每次都编译,但是当它不引用DMV而是硬编码一个值时,我没有检查触发器是否在每次触发时都编译。每次触发时它仍在编译。放下触发器将停止编译。 我们在XE会话中使用sqlserver.query_pre_execution_showplan来跟踪编译。为什么与PerfMon计数器之间存在差异? 每次触发运行时,您都会收到一个编译事件是否正常? 复制脚本: CREATE TABLE t1 (transaction_id int, Column2 varchar(100)); CREATE TABLE t2 (Column1 varchar(max), Column2 varchar(100)); GO CREATE TRIGGER t2_ins ON t2 AFTER INSERT AS INSERT INTO t1 SELECT (SELECT TOP 1 transaction_id FROM sys.dm_tran_active_transactions), Column2 FROM inserted; GO --Both of these show compilation …

3
大型(> 22万亿项)地理空间数据集,具有快速(<1s)的读取查询性能
我正在为大型地理空间数据集设计一个新系统,这将需要快速的读取查询性能。因此,我想看看是否有人认为在以下情况下有合适的DBMS,数据结构或其他方法来实现所需的性能,或者是否有经验/建议: 将从处理后的卫星雷达数据中连续产生数据,这些数据将覆盖全球。根据卫星的分辨率和地球的土地覆盖范围,我估算了完整的数据集,可在全球750亿个离散位置产生价值。在单个卫星的生命周期中,输出将在这些位置的每个位置产生多达300个值(因此,总数据集大于22万亿个值)。这是针对一颗卫星的,已经在轨道上有第二颗,在新的几年中计划再发射两颗。因此会有很多数据!单个数据项非常简单,仅包含(经度,纬度,值),但是由于项数众多,我估计单个卫星可以产生高达100TB的数据。 写入的数据永远不需要更新,因为它只会随着新的卫星采集处理而增长。写入性能并不重要,但读取性能至关重要。该项目的目标是能够通过简单的界面(如google map上的图层)可视化数据,其中每个点均基于其平均值,梯度或随时间变化的某些函数具有彩色值。(帖子末尾的演示)。 根据这些要求,数据库需要具有可伸缩性,我们可能会寻求云解决方案。该系统必须能够处理地理空间查询,例如“(纬度,经度)附近的点”和“(框)中的点”,并具有小于1的读取性能(用于定位单个点)以及包含多达50,000点(尽管最好是200,000点)。 到目前为止,我在1.11亿个位置拥有约7.5亿个数据项的测试数据集。我已经试用了一个postgres / postGIS实例,该实例可以正常运行,但是没有分片的可能性,我不能这样做,因为随着数据的增长,它也可以应对。远,并且通过分片就可以随数据量进行扩展。我最近对弹性搜索学到了一些知识,因此对此的任何评论对我来说都是新的,将是有帮助的。 这是我们希望使用完整数据集实现的快速动画: 这个gif(来自我的postgres试用版)正在提供(6x3)预先计算的栅格图块,每个图块包含约200,000点,并花费约17s来生成每个。通过单击一个点,可以通过在小于1秒的时间内将所有历史值拉到最近的位置来绘制图表。 对于冗长的帖子,我们深表歉意,欢迎提出任何意见/建议。

4
标识列上的索引是否应该非聚集?
对于具有标识列的表,是否应为标识列创建聚集或非聚集的PK /唯一索引? 原因是将为查询创建其他索引。使用非聚集索引(在堆上)并返回该索引未覆盖的列的查询将使用较少的逻辑I / O(LIO),因为没有额外的聚集索引b树查找步骤? create table T ( Id int identity(1,1) primary key, -- clustered or non-clustered? (surrogate key, may be used to join another table) A .... -- A, B, C have mixed data type of int, date, varchar, float, money, .... B .... C .... ....) create …

2
“ SELECT TOP”效果问题
我有一个查询,使用select可以运行得更快,top 100而没有则要慢得多top 100。返回的记录数为0。能否解释查询计划中的差异或在解释差异的地方共享链接? 没有top文本的查询: SELECT --TOP 100 * FROM InventTrans JOIN InventDim ON InventDim.DATAAREAID = 'dat' AND InventDim.INVENTDIMID = InventTrans.INVENTDIMID WHERE InventTrans.DATAAREAID = 'dat' AND InventTrans.ITEMID = '027743' AND InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND InventDim.ECC_BUSINESSUNITID = 'Казахстан'; 以上查询计划(不含top): https://pastebin.com/cbtJpxFf IO和TIME统计信息(无top): SQL Server parse and compile time: CPU time = 0 …


4
SQL Server发生I / O请求的时间超过15秒
在生产SQL Server上,我们具有以下配置: 将3台Dell PowerEdge R630服务器组合到可用性组中,所有3台都连接到单个RAID SAN存储单元,该存储单元是一个RAID阵列 有时,在PRIMARY上,我们会看到类似以下的消息: SQL Server在数据库ID 8 的文件[F:\ Data \ MyDatabase.mdf]中遇到11次I / O请求,而这些请求花费的时间超过15秒。OS文件句柄为0x0000000000001FBC。 最新的长I / O的偏移量是:0x000004295d0000。 长I / O的持续时间为:37397毫秒。 我们是性能故障排除的新手 解决与存储相关的特定问题的最常用方法或最佳做法是什么?必须使用哪些性能计数器,工具,监视器,应用程序等来缩小此类消息的根本原因?可能会有可以提供帮助的扩展事件,或者某种审计/日志记录?

2
添加联接提示时,为什么SQL Server行估计会更改?
我有一个查询,该查询连接了几个表并且执行得很差-行估计相差1000倍,并且选择了嵌套循环连接,从而导致了多个表扫描。查询的形状非常简单,看起来像这样: SELECT t1.id FROM t1 INNER JOIN t2 ON t1.id = t2.t1_id LEFT OUTER JOIN t3 ON t2.id = t3.t2_id LEFT OUTER JOIN t4 ON t3.t4_id = t4.id WHERE t4.id = some_GUID 在处理查询时,我注意到当我提示它对一个连接使用合并连接时,它的运行速度快了很多倍。我能理解-合并联接是联接数据的更好选择,但是SQL Server选择嵌套循环时并不能正确估计它。 我不完全理解的是,为什么此联接提示会更改所有计划运营商的所有估计?通过阅读不同的文章和书籍,我假设基数估计是在构建计划之前执行的,因此使用提示不会改变估计,而是明确地告诉SQL Server使用特定的物理联接实现。 但是,我看到的是,合并提示使所有估计变得非常完美。为什么会发生这种情况,并且有任何通用的技术可以使查询优化器在没有提示的情况下做出更好的估计-考虑到统计数据显然可以做到这一点? UPD:可在此处找到匿名的执行计划:https ://www.dropbox.com/s/hchfuru35qqj89s/merge_join.sqlplan?dl =0 https://www.dropbox.com/s/38sjtv0t7vjjfdp/no_hints_join.sqlplan?dl = 0 我使用TF 3604、9292和9204检查了两个查询使用的统计信息,它们是相同的。但是,查询之间扫描/查找的索引有所不同。 除此之外,我尝试使用来运行查询OPTION (FORCE ORDER)-它的运行速度比使用合并连接还要快,为每个连接选择HASH MATCH。

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

4
处理CXPACKET等待-设置并行性的成本阈值
作为我先前对Sharepoint网站进行性能故障的先前问题的补充,我想知道我是否可以对CXPACKET等待做点什么。 我知道下意识的解决方案是通过将MAXD​​OP设置为1来关闭所有并行性-听起来是个坏主意。但是另一个想法是在并行开始之前增加成本阈值。执行计划成本的默认值5相当低。 因此,我想知道是否存在已经写好的查询,该查询将为我找到执行计划成本最高的查询(我知道您可以找到执行时间最长的查询,依此类推-但是执行计划成本是否可在某处检索到,也可以),这还会告诉我是否已经并行执行了这样的查询。 是否有人手头有这样的脚本,或者可以将我指向相关DMV,DMF或其他系统目录视图的方向,以找出答案?

1
针对大量插入和bytea更新优化PostgreSQL
我们拥有(软件​​): 具有基本配置的PostrgeSQL 9.3(中没有更改postgresql.conf) Windows 7 64位 硬件: 英特尔酷睿i7-3770 3.9 GHz 32 Gb RAM WDC WD10EZRX-00L4HBAta驱动器(1000Gb,SATA III) 因此,我们必须加载到数据库aprox中。100.000.000行(带bytea列),以及更简单的500.000.000行(无LOB)。varchar在第一个表上有2个索引(长度为13、19),varchar在第二个表上有2 个索引(长度为18,10)。每个表还具有用于ID生成的序列。 到目前为止,这些操作是使用8个连接进行的,并具有5​​0个JDBC批处理大小。下图演示了系统负载:postgresql进程的负载为零。加载24小时后,我们仅加载了1000万行,这是非常缓慢的结果。 我们正在寻求有关调整PostrgreSQL配置的帮助,以实现以下目的: 1)为了超快地加载此数据量,这是一次操作,因此可以是临时配置 2)对于生产模式,通过它们的索引对这2个表进行适量的SELECT,而无需联接和排序。

2
优化25+百万行的查询
我正在使用MS SQL,并且必须在同一表上以不同条件运行多个查询。最初,我在原始表上运行了每个查询,尽管它们都共享一些过滤条件(即日期,状态)。这花费了很多时间(大约2分钟)。 数据行中有重复项,并且所有索引都是非聚集的。我只对4列的标准感兴趣,并且结果应仅输出所有查询的计数。 列需要:TABLE,FIELD,AFTER,DATE,并且对每一个的索引DATE和TABLE。 在仅创建了我需要的字段的临时表之后,它降到了1:40分钟,这仍然非常糟糕。 CREATE TABLE #TEMP ( TABLE VARCHAR(30) NULL, FIELD VARCHAR(30) NULL, AFTER VARCHAR(1000) NULL, DATE DATETIME, SORT_ID INT IDENTITY(1,1) ) CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID) INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE) SELECT TABLE, FIELD, AFTER, DATE FROM mytbl WITH (NOLOCK) WHERE TABLE = 'OTB' …

3
将标量函数转换为TVF函数以并行执行-仍在串行模式下运行
发布后,我的一个查询正在串行执行模式下运行,我注意到在视图中使用了两个新功能,该视图在从应用程序生成的LINQ to SQL Query中引用。因此,我将那些SCALAR函数转换为TVF函数,但查询仍在串行模式下运行。 早些时候,我在其他一些查询中将标量转换为TVF,它解决了强制串行执行的问题。 这是标量函数: CREATE FUNCTION [dbo].[FindEventReviewDueDate] ( @EventNumber VARCHAR(20), @EventID VARCHAR(25), @EventIDDate BIT ) RETURNS DateTime AS BEGIN DECLARE @CurrentEventStatus VARCHAR(20) DECLARE @EventDateTime DateTime DECLARE @ReviewDueDate DateTime SELECT @CurrentEventStatus = (SELECT cis.EventStatus FROM CurrentEventStatus cis INNER JOIN Event1 r WITH (NOLOCK) ON (cis.Event1Id = r.Id) WHERE (r.EventNumber …

1
EXCEPT运算符背后的算法是什么?
在SQL Server的幕后,Except运算符如何工作的内部算法是什么?是否在内部对每行进行哈希处理并进行比较? David Lozinksi进行了一项研究,即SQL:在尚不存在的新记录中插入新记录的最快方法。与下面的结果紧密相关。 假设:我认为Left join最快,因为它只比较1列,而Except花费的时间最长,因为它必须比较All列。 有了这些结果,现在我们的思维是“除了自动且内部对每一行进行哈希处理?”。我看了看执行计划,它确实利用了一些哈希。 背景:我们的团队正在比较两个堆表。表A将不在表B中的行插入到表B中。 堆表(来自旧文本文件系统)没有主键/向导/标识符。一些表具有重复的行,因此我们找到了每一行的哈希,并删除了重复项,并创建了主键标识符。 1)首先,我们运行一个except语句,排除(hash列) select * from TableA Except Select * from TableB, 2)然后我们在HashRowId的两个表之间进行左联接比较 select * FROM dbo.TableA A left join dbo.TableB B on A.RowHash = B.RowHash where B.Hash is null 令人惊讶的是,例外声明插入是最快的。 结果实际上与David Lozinksi的测试结果很接近

3
批量删除后,我需要重新索引mysql表吗?
我在MySQL中有一张表,每秒钟都有很多INSERT和SELECT。每天都会一次删除一些较旧的数据。删除后是否需要重新索引表?我想提高性能。有人可以建议一些技巧吗?使用“ innodb”作为存储引擎。我需要更改吗?我认为并发插入和选择更好。请提出您的建议。我需要重新编制索引吗? 提前致谢..

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.