Questions tagged «execution-plan»

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

1
与单独的SELECT相比,在OR条件下索引查找要慢得多
根据这些问题和给出的答案: SQL 2008 Server-性能损失可能与非常大的表有关 具有历史数据的大表分配了过多的SQL Server 2008 Std。内存-其他数据库的性能损失 我在数据库SupervisionP中有一个表,定义如下: CREATE TABLE [dbo].[PenData]( [IDUkazatel] [smallint] NOT NULL, [Cas] [datetime2](0) NOT NULL, [Hodnota] [real] NULL, [HodnotaMax] [real] NULL, [HodnotaMin] [real] NULL, CONSTRAINT [PK_Data] PRIMARY KEY CLUSTERED ( [IDUkazatel] ASC, [Cas] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS …

2
未使用但影响查询的索引
我有一个带有一些数字和一些其他数据的PostgreSQL 9.3表: CREATE TABLE mytable ( myid BIGINT, somedata BYTEA ) 该表当前有约10M条记录,并占用1GB磁盘空间。myid不连续。 我想计算100000个连续数字的每个块中有多少行: SELECT myid/100000 AS block, count(*) AS total FROM mytable GROUP BY myid/100000; 这将返回大约3500行。 我注意到,即使查询计划根本没有提及某个索引,该索引的存在也会显着加快此查询的速度。没有索引的查询计划: db=> EXPLAIN (ANALYZE TRUE, VERBOSE TRUE) SELECT myid/100000 AS block, count(*) AS total FROM mytable GROUP BY myid/100000; QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------- GroupAggregate (cost=1636639.92..1709958.65 …

2
使用JOIN有效地更新表
我有一个表,其中包含住户的详细信息,而另一个表中包含与住户相关的所有人员的详细信息。对于家用表,我有一个主键,它使用两列定义[tempId,n]。对于人员表,我有一个使用其3列定义的主键[tempId,n,sporder] 使用由主键上的聚集索引指示的排序,我为每个家庭[HHID]和每个人[PERID]记录生成了唯一的ID (下面的代码段用于生成PERID): ALTER TABLE dbo.persons ADD PERID INT IDENTITY CONSTRAINT [UQ dbo.persons HHID] UNIQUE; 现在,我的下一步是将每个人与相应的家庭相关联,即:将a映射[PERID]到[HHID]。两个表之间的人行横道基于两列[tempId,n]。为此,我有以下内部连接语句。 UPDATE t1 SET t1.HHID = t2.HHID FROM dbo.persons AS t1 INNER JOIN dbo.households AS t2 ON t1.tempId = t2.tempId AND t1.n = t2.n; 我总共有1928783户家庭记录和5239842人记录。当前执行时间非常长。 现在,我的问题是: 是否可以进一步优化此查询?更一般而言,优化联接查询的经验法则是什么? 是否有另一个查询构造可以在更短的执行时间内达到我想要的结果? 我已将SQL Server 2008生成的针对整个脚本的执行计划上载到 SQLPerformance.com


2
数据库查询优化器是否意识到存储性能差异?
据我了解,SQL Server(或其他任何RDBMS)中的查询优化器并不了解数据库下面存储的性能,并且会像所有存储具有相同的成本一样做出决策。这是否准确,或者是否考虑了一些有关存储性能的知识? 在一个完全人为的示例中,假设我的表行以瞬时访问时间存储在SAN中的SSD驱动器上,其中索引存储在极度超载的SAS驱动器上,从而导致磁盘饱和和恒定的磁盘队列。当RDBMS生成执行计划时,是否比索引操作更可能支持表扫描(或者可能是瘦索引和关联的表查找,而不是覆盖索引,因为它在SAS磁盘上的IO更少)? 我怀疑答案是肯定的,“优化器不会聪明甚至不会意识到磁盘性能”,但是我只是想看看那里是否有人肯定知道。我正在使用SQL Server,但对任何数据库系统都感兴趣。

3
我可以在执行计划窗格中让SSMS向我显示实际查询费用吗?
我正在解决SQL Server中多语句存储过程的性能问题。我想知道应该在哪一部分上花费时间。 我从如何阅读查询费用中了解到,它始终是百分比吗?即使SSMS被告知包括实际执行计划,“查询成本(相对于批次)”数字仍基于成本估算,这可能与实际情况相去甚远 从测量查询性能中可以了解到:“执行计划查询成本” vs“花费时间”,我可以用SET STATISTICS TIME语句围绕存储过程的调用,然后在Messages窗格中获得如下列表: SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 1 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. [etc] SQL Server Execution Times: CPU time = 187 ms, elapsed time = …

1
存储顺序与结果顺序
这是主键中指定的排序顺序的一个衍生问题,但排序是在SELECT上执行的。 @Catcall说这关于存储顺序(聚集索引)和输出顺序 许多人认为聚集索引可以保证输出的排序顺序。但这不是它的作用。它保证了磁盘上的存储顺序。 例如,请参阅此博客文章。 我已经阅读了Hugo Kornelis的博客文章,并且了解到索引并不能保证sql服务器按特定顺序读取记录。但是我很难接受我不能为我的情况承担这个责任吗? CREATE TABLE [dbo].[SensorValues]( [DeviceId] [int] NOT NULL, [SensorId] [int] NOT NULL, [SensorValue] [int] NOT NULL, [Date] [int] NOT NULL, CONSTRAINT [PK_SensorValues] PRIMARY KEY CLUSTERED ( [DeviceId] ASC, [SensorId] ASC, [Date] DESC ) WITH ( FILLFACTOR=75, DATA_COMPRESSION = PAGE, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, …

1
重新运行特定的实际查询计划
我已经捕获了特定查询的实际查询计划。 之后,我更改了一些内容(包括更新统计信息)并重新运行了该特定查询。现在,实际的查询计划有所不同(这很有意义)。 现在查询运行速度快得多。我很好奇新的执行计划是否与此有关,因为其他更改(IO设置更改,VM设置更改,sql实例重启等)也可能导致性能提高。为了对此进行测试,我想再次运行查询,并尝试强制SQL Server使用旧的执行计划。 问题:有没有一种方法可以使用用户提供的执行计划重新运行查询,甚至可以直接从这样的计划运行查询? 这是我试图弄清楚的一件事: 我搜索了我们在办公室可获得的书籍(《Professional SQL Server 2012内部和故障排除》,《查询Microsoft SQL Server 2012》); Google搜索,例如“根据特定查询计划运行查询” DBA.SE搜索,例如“执行查询计划”和“重新运行执行计划” 最后,一个回答了我很多次的问题:在单击“发布您的问题”之前,请仔细检查“可能已经有了答案的问题” :-) 底线是:这可能吗?如果是这样:如何?
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.