Questions tagged «execution-plan»

查询优化器选择的用于处理查询的策略。

1
查询存储强制计划功能不起作用
查询存储强制计划功能似乎没有执行该计划。 我知道查询存储-强制并不总是意味着强制;但是,我的计划可能不会发生重大变化,但是查询优化器可能会继续选择错误的索引,循环选择等。 基本上:它不符合我的强制计划选择。我强迫了许多计划,但没用。 当我查看时,有0个失败计数或原因sys.query_store_plan force_failure_count。 扩展事件query_store_plan_forcing_failed不会产生任何结果。0活动。 例如,一个计划在20.09开始实施。只有1次编译碰巧使用了强制计划。 这些计划大相径庭,一个计划与INDEX 1一起使用哈希匹配联接,另一个计划与INDEX 2一起使用循环联接。 版本:Microsoft SQL Server 2016(SP1-GDR)(KB3210089)-13.0.4202.2(X64) 我在这里想念什么?

3
PostgreSQL顺序扫描而不是索引扫描为什么?
大家好我的PostgreSQL数据库查询有问题,想知道是否有人可以提供帮助。在某些情况下,我的查询似乎忽略了我创建的用于连接两个表data和的索引data_area。发生这种情况时,它将使用顺序扫描并导致查询慢得多。 顺序扫描(约5分钟) Unique (cost=15368261.82..15369053.96 rows=200 width=1942) (actual time=301266.832..301346.936 rows=153812 loops=1) CTE data -> Bitmap Heap Scan on data (cost=6086.77..610089.54 rows=321976 width=297) (actual time=26.286..197.625 rows=335130 loops=1) Recheck Cond: (datasetid = 1) Filter: ((readingdatetime >= '1920-01-01 00:00:00'::timestamp without time zone) AND (readingdatetime <= '2013-03-11 00:00:00'::timestamp without time zone) AND (depth >= 0::double …

3
如何调查BULK INSERT语句的性能?
我主要是使用Entity Framework ORM的.NET开发人员。但是,因为我不想失败使用ORM,所以我试图了解数据层(数据库)中发生的情况。基本上,在开发过程中,我启动了探查器,并检查了查询中代码的某些部分生成了什么。 如果我发现非常复杂的东西(即使不仔细编写,ORM甚至可以从相当简单的LINQ语句生成可怕的查询)和/或繁重的事情(持续时间,CPU,页面读取),请在SSMS中进行处理并检查其执行计划。 对于我的数据库知识水平,它工作正常。但是,BULK INSERT似乎是一种特殊的生物,因为它似乎不会产生SHOWPLAN。 我将尝试说明一个非常简单的示例: 表定义 CREATE TABLE dbo.ImportingSystemFileLoadInfo ( ImportingSystemFileLoadInfoId INT NOT NULL IDENTITY(1, 1) CONSTRAINT PK_ImportingSystemFileLoadInfo PRIMARY KEY CLUSTERED, EnvironmentId INT NOT NULL CONSTRAINT FK_ImportingSystemFileLoadInfo REFERENCES dbo.Environment, ImportingSystemId INT NOT NULL CONSTRAINT FK_ImportingSystemFileLoadInfo_ImportingSystem REFERENCES dbo.ImportingSystem, FileName NVARCHAR(64) NOT NULL, FileImportTime DATETIME2 NOT NULL, CONSTRAINT UQ_ImportingSystemImportInfo_EnvXIs_TableName UNIQUE …

1
寻求谓词与谓词之间的区别
我正在尝试性能调整SQL Server 2014 Enterprise中的查询。 我已经在SQL Sentry Plan Explorer中打开了实际的查询计划,并且可以在一个节点上看到它具有Seek谓词和Predicate。 Seek谓词和Predicate有什么区别? 注意:我可以看到此节点存在很多问题(例如,估计行与实际行,剩余IO),但问题与任何这些都不相关。

2
为什么DELETE查询以一种格式运行的时间要长于另一种格式?
我有特定的清理代码,试图删除一些重复项。 它可以在许多客户站点上完美运行。日志告诉我,此查询至少消耗1秒到45秒: DELETE FROM [tbl] WHERE [Id] NOT IN ( SELECT MIN([Id]) FROM [tbl] GROUP BY [IdProject], [IdRepresentative], [TimeStart] ) 但是我有一个客户,该查询运行了4个多小时(到现在为止还没有结束)!我检查了数据库(DBCC CHECKDB),我已经更新了统计信息(sp_updatestats),也UPDATE STATISTICS [tbl] WITH FULLSCAN没有显示任何更改。 我有客户的数据库原始备份。我在SQL Server 14.0.2002.14上运行它。我有标准版,客户使用Express Edition。 我可以在活动监视器中看到没有其他人正在使用该数据库。无需等待,CPU使用率达到25%(恰好是我4个CPU中的1个)。同样在这个测试用例中,没有其他人正在使用数据库。 我重新设计了查询并检查了以下语句: DELETE FROM [tbl] FROM [tbl] AS t LEFT OUTER JOIN ( SELECT MIN([Id]) AS [IdMin] FROM [tbl] GROUP …

2
为什么我将Int / Smallint隐式转换为Varchar,这真的会影响基数估计吗?
我正在尝试使用实际执行计划上的“显示计划分析”(SSMS)来执行性能缓慢的查询。分析工具指出,行数的估计值与计划中某些位置的返回结果不符,并进一步给了我一些隐式转换警告。 我不理解这些从int到Varchar的隐式转换-引用的字段不是查询中任何参数/过滤器的一部分,并且在涉及的所有表中,列数据类型都是相同的: 我收到以下CardinalityEstimate警告: 表达式中的类型转换(CONVERT_IMPLICIT(varchar(12),[ccd]。[profileid],0))可能会影响查询计划选择中的“ CardinalityEstimate”-该字段在我的数据库中到处都是整数 表达式中的类型转换(CONVERT_IMPLICIT(varchar(6),[ccd]。[nodeid],0))可能会影响查询计划选择中的“ CardinalityEstimate”-该字段在我数据库中的每个地方都是smallint 表达式中的类型转换(CONVERT_IMPLICIT(varchar(6),[ccd]。[sessionseqnum],0))可能会影响查询计划选择中的“ CardinalityEstimate”-该字段在我的数据库中到处都是smallint 表达式中的类型转换(CONVERT_IMPLICIT(varchar(41),[ccd]。[sessionid],0))可能会影响查询计划选择中的“ CardinalityEstimate”-该字段在我的数据库中到处都是小数 [编辑]这是查询和实际执行计划,以供参考 https://www.brentozar.com/pastetheplan/?id=SysYt0NzN 和表定义 /****** Object: Table [dbo].[agentconnectiondetail] Script Date: 1/10/2019 9:10:04 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[agentconnectiondetail]( [sessionid] [decimal](18, 0) NOT NULL, [sessionseqnum] [smallint] NOT NULL, [nodeid] [smallint] NOT NULL, [profileid] [int] …

1
SQL Server查询计划XML:QueryPlanHash长度
更新:这绝对是一个错误。有关详细信息,请参见此连接项。 在测试对sp_BlitzCache的一些更改(完整披露,我是作者之一)时,我遇到了我认为是代码中的错误的地方。 一方面,我们要匹配查询计划哈希以获取查询成本。我们这样做是这样的: statement.value('sum(/p:StmtSimple[xs:hexBinary(substring(@QueryHash, 3)) = xs:hexBinary(sql:column("b.QueryHash"))]/@StatementSubTreeCost)', 'float') 据我所知,这已经奏效了。但是,在一种奇怪的情况下,XML中的子字符串引发了一个NULL值,尽管成本很高,但该计划的成本却显示为0。 深入研究执行计划(全面披露,我在负责Paste The Plan的公司工作),我注意到一个问题哈希的“查询计划哈希”长为17个字符,其余为18个字符。以下示例: QueryPlanHash =“ 0x4410B0CA640CDA89” QueryPlanHash =“ 0x2262FEA4CE645569” QueryPlanHash =“ 0xED4F225CC0E97E5” –问题! QueryPlanHash =“ 0xBF878EEE6DB955EA” QueryPlanHash =“ 0x263B53BC8C14A452” QueryPlanHash =“ 0x89F5F146CF4B476F” QueryPlanHash =“ 0xEF47EA40805C8961” QueryPlanHash =“ 0xB7BE27D6E43677A5” QueryPlanHash =“ 0x815C54EC43A6A6E9” 查询计划哈希上市为BINARY 8-想必这应该是相同的长度,但到底是什么像我这样的人了解二进制值? 稍微玩一下XQuery,我发现通过将子字符串更改为从第二个位置开始,它会得出一个有效的(尽管不正确)哈希值。 WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p) SELECT QueryPlanCost = …

2
奇数流聚合行为
查询: declare @X xml = ' <item ID = "0"/> <item ID = "1"/> <item/> <item/>'; select I.X.value('@ID', 'int') from @X.nodes('/item') as I(X); 结果: ----------- 0 1 NULL NULL 执行计划: 顶部分支将XML切成四行,底部分支获取该属性的值ID。 让我感到奇怪的是,从Stream Aggregate运算符返回的行数。来自筛选器的2行是XML中ID第一个和第二个item节点的属性。流聚合返回四行,每一输入行一个,有效地将“内部联接”转换为“外部联接”。 这是否也是Stream Aggregate在其他情况下所做的事情,还是在进行XML查询时发生的奇怪事情? 我在查询计划的XML版本中看不到任何暗示,此Stream Aggregate的行为应与我之前注意到的任何其他Stream Aggregate有所不同。

4
SQL Server无法在简单双射上使用索引
这是另一个查询优化器难题。 也许我只是高估了查询优化器,或者我错过了一些东西,所以我把它放在了那儿。 我有一张简单的桌子 CREATE TABLE [dbo].[MyEntities]( [Id] [uniqueidentifier] NOT NULL, [Number] [int] NOT NULL, CONSTRAINT [PK_dbo.MyEntities] PRIMARY KEY CLUSTERED ([Id]) ) CREATE NONCLUSTERED INDEX [IX_Number] ON [dbo].[MyEntities] ([Number]) 带有一个索引和几千行,Number均匀分布在值0、1和2中。 现在这个查询: SELECT * FROM (SELECT [Extent1].[Number] AS [Number], CASE WHEN (0 = [Extent1].[Number]) THEN 'one' WHEN (1 = [Extent1].[Number]) THEN 'two' …

3
如何回答为什么突然需要索引或查询的问题
我是具有3年经验的初级DBA。我们的工作是微调查询或建议开发人员应重写特定代码或需要索引。 开发团队经常问的一个简单问题是:“昨天运行良好,突然发生了什么变化?” 我们将被要求检查基础设施方面。对任何问题的第一反应总是似乎是将最大的责任归咎于基础架构,这始终是首先要进行验证的事情。 我们应该如何回答开发团队的“已更改”问题?你们曾经遇到过同样的情况吗?如果是这样,请分享您的经验。

1
将查询计划按语句拆分以提高可重用性会更好吗?
从我对查询计划如何通过查询进行编译,存储和检索的有限知识中,我了解到多语句查询或存储过程将生成其查询计划,该查询计划将存储在查询计划缓存中,以供查询在将来的执行中使用。 我认为此计划是使用查询哈希从查询计划缓存中检索的,这意味着如果编辑并执行查询,哈希将有所不同,并且会生成新计划,因为在查询计划缓存中找不到匹配的哈希。 我的问题是:如果用户执行多语句查询中的语句之一的语句,是否可以将缓存中已存在的查询计划的相关部分用于多语句查询?我希望答案是否定的,因为哈希值显然不匹配,但是对多语句查询中的每个语句进行哈希处理会更好些,以便用户在查询中运行单个语句可以使用它们吗? 我希望有一些我没有考虑到的复杂因素(而这正是我真正想知道的),但似乎我们可以在许多查询计划中存储相同的“语句计划”,从而占用更多空间并占用更多时间CPU和生成时间。 可能只是显示我的无知。

2
了解统计信息,执行计划和“升序关键问题”
我试图更好地(从概念上)理解统计信息,执行计划,存储过程执行之间的关系。 我是否正确地说统计仅在为存储过程创建执行计划时使用,而没有在实际执行上下文中使用?换句话说,如果这是真的,那么一旦创建了计划(并假设其已正确使用),“最新”统计数据的重要性如何? 我读过的一篇文章(《统计》,《行估计》和《升序的日期》栏)使我特别受启发,该文章描述了一种非常类似于我每天都使用客户数据库的情况。 在我们使用特定存储过程定期查询的最大表之一中,我们有一个升序的日期/时间列。 当每天增加十万行时,如何防止执行计划变得过时? 如果我们经常更新统计信息以解决此问题,那么在此存储过程的查询中使用OPTION(RECOMPILE)提示是否有意义? 任何意见或建议,将不胜感激。 更新:我正在使用SQL Server 2012(SP1)。

2
没有PARTITION BY的ROW_NUMBER()仍会生成细分迭代器
我正在写我即将发表的有关排名和聚合窗口函数的博客文章,特别是Segment和Sequence Project迭代器。据我了解,Segment会识别流中构成组末尾的行,因此请执行以下查询: SELECT ROW_NUMBER() OVER (PARTITION BY someGroup ORDER BY someOrder) 将使用Segment来区分某行何时属于上一行以外的其他组。然后,Sequence Project迭代器根据Segment迭代器输出的输出进行实际的行号计算。 但是,使用该逻辑的以下查询不必包含细分,因为没有分区表达式。 SELECT ROW_NUMBER() OVER (ORDER BY someGroup, someOrder) 但是,当我尝试此假设时,这两个查询都使用Segment运算符。唯一的区别是第二个查询不需要GroupBy在细分上输入。难道不是一开始就不需要细分吗? 例 CREATE TABLE dbo.someTable ( someGroup int NOT NULL, someOrder int NOT NULL, someValue numeric(8, 2) NOT NULL, PRIMARY KEY CLUSTERED (someGroup, someOrder) ); --- Query 1: SELECT …

1
带函数调用的估计查询计划与实际查询计划
我在SQL Server上有此查询,这是一个合并复制查询: SELECT DISTINCT b.tablenick, b.rowguid, c.generation, sys.fn_MSgeneration_downloadonly ( c.generation, c.tablenick ) FROM #belong b LEFT OUTER JOIN dbo.MSmerge_contents c ON c.tablenick = b.tablenick AND c.rowguid = b.rowguid; 估计的查询计划包括有关3个查询的信息: 上面的查询 函数调用fn_MSgeneration_downloadonly 对fn_MSArticle_has_downloadonly_property的函数调用 实际的查询计划仅包含以下信息: 上面的查询 与功能无关。为什么实际计划中缺少功能信息? 我尝试了以下选项: SET STATISTICS PROFILE ON SET STATISTICS XML ON 它创建了一个实际计划,但缺少第2部分和第3部分,与我在Management Studio中使用实际查询计划选项时相同。 例如,如果我要使用Profiler捕获有关函数调用的信息,我将选择哪些事件? 找不到与查询计划特别相关的答案,但我分析了SP:StmtStarting和SP:StmtCompleted并显示了函数调用。

1
在JOIN子句中使用OR时奇怪的查询计划-持续扫描表中的每一行
我正在尝试生成一个示例查询计划,以说明为什么对两个结果集进行UNIONing可能比在JOIN子句中使用OR更好。我写的查询计划让我感到困惑。我将StackOverflow数据库与Users.Reputation上的非聚集索引一起使用。 查询是 CREATE NONCLUSTERED INDEX IX_NC_REPUTATION ON dbo.USERS(Reputation) SELECT DISTINCT Users.Id FROM dbo.Users INNER JOIN dbo.Posts ON Users.Id = Posts.OwnerUserId OR Users.Id = Posts.LastEditorUserId WHERE Users.Reputation = 5 查询计划位于https://www.brentozar.com/pastetheplan/?id=BkpZU1MZE,对我来说查询时间为4:37分钟,返回了26612行。 我以前从未见过从现有表中创建过这种恒定扫描的样式-我不熟悉为什么在用户输入的单行通常使用恒定扫描的情况下,每行都要进行恒定扫描的原因例如SELECT GETDATE()。为什么在这里使用它?在阅读此查询计划时,我将非常感谢一些指导。 如果我将该OR拆分为一个UNION,它将生成一个标准计划,该计划在12秒内运行,并返回相同的26612行。 SELECT Users.Id FROM dbo.Users INNER JOIN dbo.Posts ON Users.Id = Posts.OwnerUserId WHERE Users.Reputation = 5 UNION SELECT Users.Id …

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.