Questions tagged «execution-plan»

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


1
为SQL Server中的所有连接设置ARITHABORT ON的后果是什么?
因此,我确定SQL Server的行为不稳定是由于.Net SqlClient数据提供程序的默认设置为SET ARITHABORT OFF。话虽如此,我已经阅读了各种文章,讨论了实现此目标的最佳方法。对我来说,我只想采用一种简单的方法,因为SQL Server遭受了麻烦,而且我的查询调优还没有完全跨应用程序(显然,SET在sp中添加不能正常工作)。 在Erland Sommarskog 关于该主题的精彩文章中,他基本上建议通过更改要SET ARITHABORT ON为连接发布的应用程序来采用安全的方法。但是,在dba.stackexchange 问题的此答案中,Solomon Rutzky 提供了实例范围和数据库范围的方法。 在此设置整个实例范围时,我在这里缺少什么后果?正如我所看到的...由于SSMS ON默认情况下已设置了此设置,所以我认为在ON所有服务器范围内都设置此服务器范围没有什么害处。归根结底,我只需要此SQL Server才能执行最重要的任务。

1
为什么不能使用sys.query_store_plan加入消除功能?
以下是查询存储遇到的性能问题的简化: CREATE TABLE #tears ( plan_id bigint NOT NULL ); INSERT #tears (plan_id) VALUES (1); SELECT T.plan_id FROM #tears AS T LEFT JOIN sys.query_store_plan AS QSP ON QSP.plan_id = T.plan_id; 该plan_id列被记录为的主键sys.query_store_plan,但是执行计划未按预期使用联接消除: 没有从DMV投影任何属性。 DMV主键plan_id不能复制临时表中的行 使用A LEFT JOIN,因此无法T消除中的任何行。 执行计划 为什么会这样?在这里如何做才能消除连接?


1
报告的索引大小和执行计划中的缓冲区数之间存在巨大的不匹配
问题 我们有一个类似的查询 SELECT COUNT(1) FROM article JOIN reservation ON a_id = r_article_id WHERE r_last_modified < now() - '8 weeks'::interval AND r_group_id = 1 AND r_status = 'OPEN'; 由于超时(通常在10分钟后)更多,因此我决定调查此问题。 该EXPLAIN (ANALYZE, BUFFERS)输出如下所示: Aggregate (cost=264775.48..264775.49 rows=1 width=0) (actual time=238960.290..238960.291 rows=1 loops=1) Buffers: shared hit=200483 read=64361 dirtied=666 written=8, temp read=3631 written=3617 I/O Timings: …

1
为什么在此查询中不使用主键(集群键)?
我有一个SQL Server 2008 R2表,其表结构如下所示: CREATE TABLE [dbo].[CDSIM_BE] ( [ID] [bigint] NOT NULL, [EquipmentID] [varchar](50) NOT NULL, [SerialNumber] [varchar](50) NULL, [PyrID] [varchar](50) NULL, [MeasMode] [varchar](50) NULL, [ReadTime] [datetime] NOT NULL, [SubID] [varchar](15) NULL, [ProbePosition] [float] NULL, [DataPoint] [int] NULL, CONSTRAINT [PK_CDSIM_BE] PRIMARY KEY CLUSTERED ([ID] ASC, [EquipmentID] ASC, [ReadTime] ASC) WITH …

1
查询计划更改SQL Server 2014中的性能更差
我们最近将服务器从SQL Server 2008R2升级到SQL Server2014。我们在2008R2中运行良好,但现在在2014年运行速度慢得令人难以置信,执行计划也很差。 我已经做了几次测试... 将2014 DB切换回2008/2012兼容模式。 使用分页测试查询。 两者都导致查询运行与SQL Server 2008R2相同,并且运行速度很快。 为什么计划如此糟糕,并且查询在SQL Server 2014中运行了这么长时间? 此图显示了2个查询,一个查询使用它在2008R2中运行的行号,然后第二个是分页修复。两者都在2014年运行,但都非常不同,但是在2008年,我们看到的效果与2014年使用分页时相同。

2
由于行估计非常不准确,导致全文搜索速度缓慢
对该数据库进行全文查询(存储RT(请求跟踪程序)票证)似乎需要很长时间才能执行。附件表(包含全文数据)约为15GB。 数据库模式如下,大约有200万行: rt4 =#\ d +附件 表“ public.attachments” 专栏 类型 修饰符| 储存| 描述 ----------------- + ----------------------------- +- -------------------------------------------------- ------ + ---------- + ------------- id | 整数| 不是null默认nextval('attachments_id_seq':: regclass)| 普通 transactionid | 整数| 不为空| 普通 父| 整数| 不为null默认值0 | 普通 messageid | 角色变化(160)| | 扩展| 主题| 字符变化(255)| | 扩展| 文件名| 字符变化(255)| …



1
检测到SQLHANDLE的可能的无限重新编译
我一直在sql错误日志中发现奇怪的错误消息: Bocss:每小时都会发生同样的僵局–需要调查 此外,按照以下示例,错误日志中还列出了许多其他SPID的重新编译内容: 2015年9月4日14:30:10,spid64,未知,为SQLHANDLE检测到可能的无限重新编译0x0200000059631A288882589E0C54B76404CAE1B97E08D368000000000000000000000000000000000000000000 PlanHandle 0x0600040059631A2860A62B654100000001000000000000000000000000000000000000600最后一次补偿是10:30/04/04:10:04/04 /结尾,spid150,未知,已检测到SQLHANDLE 0x02000000EF886F018C4E0B163812B8B20150FE8FC7E6A06A000000000000000000000000000000000000000000 PlanHandle 0x06000400EF886F01901A816E0600000001000000000000000000000000000000000000000000000000000000的可能无限重新编译,起始偏移量998Uncompute 09,20 09:09结束,偏移量2020是:0909结束时的偏移量2020:20,09:09结束,偏移量2030:0检测到可能无限的重新编译为SQLHANDLE 0x0200000057C4C632D9052275CFF2B683B80F29501EE91D730000000000000000000000000000000000000000 PlanHandle 0x0600040057C4C63200EAC2BE3000000001000000000000000000000000000000000000000000000000000000起始偏移1064结束偏移2652是2. 2015年9月4日14最后重新编译原因:30:09,spid163,未知,是为SQLHANDLE 0x02000000E7C7BF0E5D70DE55759C7842860272AD474D69AB0000000000000000000000000000000000000000 PlanHandle探测到一个可能无限的重新编译0x06000400E7C7BF0EF0EB68A52C00000001000000000000000000000000000000000000000000000000000000000000起始偏移量1028终止偏移量2580.上次重新编译的原因是2。 是什么原因造成的? 看来我已经没有计划在缓存中了。 按照这篇文章的建议 http://www.sqlservercentral.com/Forums/Topic1479420-146-1.aspx 然后作为一项安全措施禁用了全文目录,这没有什么区别,因此我完全回滚了更改(删除了新对象等)。这也没有什么不同,最终似乎唯一阻止它的是重启SQL实例,这立即解决了问题。 这样也可以解决我的问题,但是,我仍然首先要找出是什么原因造成了这种混乱?


1
缺少的非聚集索引已成为聚集索引的一部分
我正在调试运行缓慢的查询,在执行计划中建议使用51.6648 Impact的非聚集索引。但是,非聚集索引仅包括主键(PK)复合聚集索引中已经存在的列。 难道是因为索引中列的顺序?即,如果聚集索引中的列从最有选择性到最少的顺序不顺序,那么非聚集索引是否有可能提高性能? 此外,非聚集索引仅包含三个PK列中的两个,而第三个添加为包含列。include使用非聚集索引可能会更优化的另一个原因吗? 以下是我正在使用的表结构的示例: 桌子- Retailers ( RetailerID int PK, name ...) Retailer_Relation_Types ( RelationType smallint PK, Description nvarchar(50) ...) Retailer_Relations ( RetailerID int PK FK, RelatedRetailerID int PK FK, RelationType smallint PK FK, CreatedOn datetime ...) 该表Retailer_Relations具有以下综合PK指数和建议指数- CONSTRAINT PK_Retailer_Relations PRIMARY KEY CLUSTERED ( RetailerID ASC, RelatedRetailerID ASC, RelationType …

1
指数寻求运营商成本
对于下面的AdventureWorks示例数据库查询: SELECT P.ProductID, CA.TransactionID FROM Production.Product AS P CROSS APPLY ( SELECT TOP (1) TH.TransactionID FROM Production.TransactionHistory AS TH WHERE TH.ProductID = P.ProductID ORDER BY TH.TransactionID DESC ) AS CA; 执行计划显示针对Index Seek的估计运营商成本为0.0850383(93%): 成本与使用的基数估计模型无关。 这不是“ 估计的CPU成本”和“ 估计的I / O成本”的简单相加。一次执行索引搜索的成本也不乘以估计的执行次数。 这个费用数字是如何得出的?

1
主表/明细表之间的哈希联接产生的基数估计值太低
将主表连接到明细表时,如何鼓励SQL Server 2014将较大(详细)表的基数估计用作联接输出的基数估计? 例如,当将10K主行连接到100K详细信息行时,我希望SQL Server估计100K行的联接-与详细信息行的估计数量相同。如何构造查询和/或表和/或索引,以帮助SQL Server的估计器利用每个详细信息行始终都有一个对应的主行这一事实?(这意味着它们之间的连接永远不会降低基数估计。) 这里有更多细节。我们的数据库有一个主/明细表对:VisitTarget每个销售交易VisitSale都有一行,而每个交易中每个产品都有一行。这是一对多的关系:一个VisitTarget行,平均10个VisitSale行。 这些表如下所示:(我将简化为该问题的相关列) -- "master" table CREATE TABLE VisitTarget ( VisitTargetId int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, SaleDate date NOT NULL, StoreId int NOT NULL -- other columns omitted for clarity ); -- covering index for date-scoped queries CREATE NONCLUSTERED INDEX IX_VisitTarget_SaleDate ON VisitTarget …

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.