Questions tagged «query-performance»

有关改善数据库查询的性能和/或效率的问题。

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] …

5
提高sys.dm_db_index_physical_stats的性能
在维护工作期间,我正在尝试获取碎片索引的列表。但是查询非常慢,需要30多分钟才能执行。我认为这是由于对sys.dm_db_index_physical_stats进行的远程扫描。 有什么方法可以加快以下查询的速度: SELECT OBJECT_NAME(i.OBJECT_ID) AS TableName, i.name AS TableIndexName FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') phystat INNER JOIN sys.indexes i ON i.OBJECT_ID = phystat.OBJECT_ID AND i.index_id = phystat.index_id WHERE phystat.avg_fragmentation_in_percent > 20 AND OBJECT_NAME(i.OBJECT_ID) IS NOT NULL ORDER BY phystat.avg_fragmentation_in_percent DESC 我不是DBA,可能在上面的查询中犯了一个明显的错误,或者也许有些索引或统计信息会有所帮助?也许只是数据库的大小(大约20Gb,大约140个表)。 我问的原因是,我们在夜间只有一个很小的维护窗口,这在大多数时候都占用了。

2
为什么查询在存储过程中比在查询窗口中运行慢?
我有一个复杂的查询,它在查询窗口中运行2秒钟,但作为存储过程大约5分钟。为什么以存储过程的形式运行需要花费更长的时间? 这是我的查询的样子。 它采用一组特定的记录(由@id和标识@createdDate)和特定的时间范围(从开始的1年@startDate),并返回已发送信件的摘要列表以及由于这些信件而产生的估计付款。 CREATE PROCEDURE MyStoredProcedure @id int, @createdDate varchar(20), @startDate varchar(20) AS SET NOCOUNT ON -- Get the number of records * .7 -- Only want to return records containing letters that were sent on 70% or more of the records DECLARE @limit int SET @limit = IsNull((SELECT Count(*) …

2
什么索引可用于大量重复值?
让我们做一些假设: 我有这样的表: a | b ---+--- a | -1 a | 17 ... a | 21 c | 17 c | -3 ... c | 22 关于我的场景的事实: 整个表的大小是〜10 10行。 我有〜100k行,其中acolumn中有值,a其他值也类似(例如c)。 这意味着“ a”列中的〜100k个不同的值。 我的大部分查询将读取例如中的给定值的全部或大部分值select sum(b) from t where a = 'c'。 该表以这样的方式编写,即连续值在物理上接近(或者按顺序编写,或者我们假设CLUSTER已在该表和column上使用过a)。 该表很少更新(如果有的话),我们只关心读取速度。 该表相对较窄(例如每个元组约25个字节,+ 23个字节的开销)。 现在的问题是,我应该使用哪种索引?我的理解是: BTree我的问题是BTree索引将是巨大的,因为据我所知它将存储重复值(它必须这样做,因为它不能假定表是物理排序的)。如果BTree很大,那么我最终必须同时读取索引和该索引指向的表的各个部分。(我们可以用来fillfactor = 100稍微减小索引的大小。) BRIN我的理解是,我可以在这里建立一个小的索引,而以阅读无用的页面为代价。使用较小的值pages_per_range表示索引较大(这是BRIN的问题,因为我需要读取整个索引),使用较大的值pages_per_range表示我将读取很多无用的页面。pages_per_range考虑到这些折衷,是否有一个神奇的公式可以找到一个好的价值? GIN …

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 …

1
比较SQL Server 2012中的两个查询
我正在比较SQL Server 2012中的两个查询。目标是在选择最佳查询时使用查询优化器中所有可用的相关信息。这两个查询产生相同的结果。所有客户的最大订单编号。 在使用FREEPROCCACHE和DROPCLEANBUFFERS执行每个查询之前,已清除缓冲池 使用下面提供的信息,哪个查询是更好的选择? -- Query 1 - return the maximum order id for a customer SELECT orderid, custid FROM Sales.Orders AS O1 WHERE orderid = (SELECT MAX(O2.orderid) FROM Sales.Orders AS O2 WHERE O2.custid = O1.custid); -- Query 2 - return the maximum order id for a customer SELECT …

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

3
为什么选择此查询的所有结果列比选择我关心的一列要快?
我有一个查询,其中使用select *不仅读取次数少得多,而且比使用占用的CPU时间少得多select c.Foo。 这是查询: select top 1000 c.ID from ATable a join BTable b on b.OrderKey = a.OrderKey and b.ClientId = a.ClientId join CTable c on c.OrderId = b.OrderId and c.ShipKey = a.ShipKey where (a.NextAnalysisDate is null or a.NextAnalysisDate < @dateCutOff) and b.IsVoided = 0 and c.ComplianceStatus in (3, 5) …

2
内部联接的基数估计问题
我正在努力理解为什么行估计是如此严重的错误,这是我的情况: 简单连接-使用SQL Server 2016 sp2(在sp1上存在相同问题),dbcompatiblity = 130。 select Amount_TransactionCurrency_id, CurrencyShareds.id from CurrencyShareds INNER JOIN annexes ON Amount_TransactionCurrency_id = CurrencyShareds.Id option (QUERYTRACEON 3604, QUERYTRACEON 2363); SQL估计1行,而SQL为107131,并选择做一个嵌套循环(链接到plan)。在CurrencyShareds上更新统计信息之后,估算就可以了,并选择了合并联接(链接到新计划)。一旦仅将一条记录添加到CurrencyShareds,统计信息就会“过时”,并且sql返回错误的估计。 我不太担心这个简单的查询,但这只是一个更大的查询的一部分,而这就是多米诺骨牌的开始... 为什么在100条记录表中添加一行会造成这种损坏?查看基数估计跟踪的输出时,我看到此警告,***WARNING: badly-formed histogram ***但在此主题上找不到更多信息。 这是基数估计的全部输出: Begin selectivity computation Input tree: LogOp_Join CStCollBaseTable(ID=1, CARD=107131 TBL: annexes) CStCollBaseTable(ID=2, CARD=100 TBL: CurrencyShareds) ScaOp_Comp x_cmpEq ScaOp_Identifier QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id …

4
如何将前1亿个正整数转换为字符串?
这与实际问题有些牵连。如果提供上下文帮助,则生成此数据可能对处理字符串的性能测试方式,生成需要在游标中对其应用某些操作的字符串或生成敏感数据的唯一匿名名称替换有用。我只是对在SQL Server中生成数据的有效方式感兴趣,请不要问为什么我需要生成此数据。 我将尝试从一个正式的定义开始。如果字符串仅由A-Z的大写字母组成,则包含在该系列中。该系列的第一项是“ A”。该系列由所有有效字符串组成,这些字符串按长度优先,然后按典型字母顺序排列。如果字符串在名为的列的表中STRING_COL,则该顺序可以在T-SQL中定义为ORDER BY LEN(STRING_COL) ASC, STRING_COL ASC。 为了给出一个不太正式的定义,请查看excel中按字母顺序排列的列标题。该系列是相同的模式。考虑如何将整数转换为以26为底的数字: 1-> A,2-> B,3-> C,...,25-> Y,26-> Z,27-> AA,28-> AB,... 这个类比不是很完美,因为“ A”的行为不同于以10为底的0。下表列出了一些选定的值,希望可以使其更加清楚: ╔════════════╦════════╗ ║ ROW_NUMBER ║ STRING ║ ╠════════════╬════════╣ ║ 1 ║ A ║ ║ 2 ║ B ║ ║ 25 ║ Y ║ ║ 26 ║ Z ║ ║ 27 ║ …

2
SELECT TOP 1会损害查询性能;有没有dba可访问的方法来克服这个问题?
在生产应用程序(C#与SQL Server 2014 Standard对话)中,下面是一个查询,如下所示。大多数情况下,它以毫秒为单位运行。但是有时(对于的某些值@Id)会变得很疯狂,并且需要一分钟左右的时间。这比应用程序超时时间长,因此该应用程序对用户而言将失败。 在“疯狂”的情况下,返回的结果集正确地为空,就像在许多但并非所有其他情况下一样。 幸运的是,这在生产和开发环境中都是可重现的。 开发人员说,从查询中删除“ TOP 1”,然后确保应用消耗了结果集的多余行,从而清除了性能问题。 查询计划程序建议不存在索引TOP 1。(在dev中)。 正在进行更改查询和修复应用程序。推出需要一段时间。 我的问题:在采用新查询的应用程序更改推出之前,是否有任何DBA可访问的方法来调整或调整生产SQL Server实例以克服此问题? SELECT TOP 1 subscription_id FROM subscription AS sub JOIN billing_info AS bi ON bi.billing_info_id = sub.billing_info_id JOIN person_group AS apg ON apg.person_id = bi.person_id JOIN pplan ON pplan.plan_id = sub.plan_id JOIN product ON product.product_id = [plan].product_id …

3
高CXPACKET和LATCH_EX等待
我正在使用的数据处理系统存在一些性能问题。我从一个小时的周期中收集了等待统计信息,其中显示了大量CXPACKET和LATCH_EX等待事件。 该系统由3个处理SQL Server组成,这些SQL Server进行了大量的数字运算和计算,然后将数据馈送到中央群集服务器中。处理服务器可以一次最多运行6个作业。这些等待统计数据是针对我认为正在引起瓶颈的中央集群的。中央群集服务器具有16个核心和64GB RAM。MAXDOP设置为0。 我猜CXPACKET来自正在运行的多个并行查询,但是我不确定LATCH_EX等待事件指示什么。从我读到的内容来看,这可能是非缓冲等待? 谁能说出这种等待统计的原因是什么,我应该采取什么行动来调查这个性能问题的根本原因? 顶部查询结果是等待的总计统计信息,底部查询结果是1小时内的统计信息

5
分页如何与SQL Server中的ROW_NUMBER一起使用?
我有一张Employee有一百万条记录的表。我有以下用于在Web应用程序中分页数据的SQL。一切正常。但是,我认为是一个问题-派生表tblEmployee选择表中的所有记录Employee(以创建 MyRowNumber值)。 我认为,这将导致选择Employee表中的所有记录。 真的有效吗?还是对SQL Server进行了优化以从原始Employee表中仅选择5条记录? DECLARE @Index INT; DECLARE @PageSize INT; SET @Index = 3; SET @PageSize = 5; SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY EmpID asc) as MyRowNumber,* FROM Employee) tblEmployee WHERE MyRowNumber BETWEEN ( ((@Index - 1) * @PageSize )+ 1) AND @Index*@PageSize


1
当where子句对`value()`进行过滤时,为什么不使用二级选择索引?
设定: create table dbo.T ( ID int identity primary key, XMLDoc xml not null ); insert into dbo.T(XMLDoc) select ( select N.Number for xml path(''), type ) from ( select top(10000) row_number() over(order by (select null)) as Number from sys.columns as c1, sys.columns as c2 ) as N; 每行的样本XML: <Number>314</Number> …

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.