相关疑难解决方法(0)

执行计划基础——哈希匹配混淆

我开始学习执行计划,并且对哈希匹配的工作原理以及为什么在简单连接中使用它感到困惑:

select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

据我了解,顶部索引扫描的结果变为可散列的,底部索引聚集扫描中的每一行都被查找。我至少在某种程度上了解哈希表是如何工作的,但我对在这样的示例中究竟哪些值进行了哈希处理感到困惑。

我认为它们之间的公共字段,即 id 被散列是有意义的——但如果是这种情况,为什么要散列一个数字?

sql-server execution-plan sql-server-2008-r2

42
推荐指数
3
解决办法
8万
查看次数

我如何阅读查询成本,它总是一个百分比吗?

我目前正在学习 SQL 70-433(Microsoft 认证考试),我对“查询成本”性能指标感到非常困惑。

根据我可以通过谷歌找到的任何文档,查询成本是一个百分比数字,代表整个批次的任何一部分所占的百分比。这对我来说似乎有点奇怪,因为我对特定查询的绝对优点感兴趣,而不是它相对于碰巧出现在它旁边的其他查询的优点。

但后来我想,好吧,也许你期望做的是并排放置两个替代查询,将它们作为“一批”运行,然后成本低于 50% 的那个就是赢家。

但微软 SQL 70-433 培训工具包的第 6 章第一课中对查询成本的讨论似乎与此无关。

这是一个示例:它们显示一个包含两个相关子查询的查询,然后通过用 OUTER APPLY 替换子查询来改进它。结果:“这个查询的成本大约是 76,而第一个查询的成本是它的两倍,大约 151。” 然后他们进一步改进了查询,并将成本从 76 降低到 3.6。它们并不暗示这些数字是百分比,而是暗示它们是与作为独立对象的查询相关的绝对数字,而不参考任何其他查询。无论如何,第一个查询的成本怎么会是 151%?

在本章的后面,他们展示了一个执行计划的屏幕截图,它包含三个部分。第一个说“成本:0%”,第二个说“成本:1%”,最后一个说“成本:99%”但是截图下面的文字(书本身)“这个查询的成本是0.56” . 我猜他们意味着其他类型的成本,但我在其他地方找不到它的参考。

有人可以帮忙吗?我彻底糊涂了。

sql-server ssms

38
推荐指数
1
解决办法
3万
查看次数

你能解释一下这个执行计划吗?

当我遇到这个东西时,我正在研究其他东西。我正在生成包含一些数据的测试表并运行不同的查询,以了解编写查询的不同方式如何影响执行计划。这是我用来生成随机测试数据的脚本:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('t') AND type in (N'U'))
DROP TABLE t
GO

CREATE TABLE t 
(
 c1 int IDENTITY(1,1) NOT NULL 
,c2 int NULL
) 
GO

insert into t
select top 1000000 a from
(select t1.number*2048 + t2.number a, newid() b
from [master]..spt_values t1 
cross join  [master]..spt_values t2
where t1.[type] = 'P' and t2.[type] = 'P') a
order by b
GO

update t set c2 = null
where c2 < 2048 * 2048 …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan sql-server-2008-r2

20
推荐指数
2
解决办法
1万
查看次数

如何使用执行计划优化 T-SQL 查询

我有一个 SQL 查询,我花了两天时间尝试使用试错法和执行计划进行优化,但无济于事。请原谅我这样做,但我会在这里发布整个执行计划。我已经努力使查询和执行计划中的表名和列名通用,既为了简洁又为了保护我公司的 IP。可以使用SQL Sentry Plan Explorer打开执行计划。

我已经完成了大量的 T-SQL,但是使用执行计划来优化我的查询对我来说是一个新领域,我真的试图了解如何去做。所以,如果有人能帮我解决这个问题并解释如何破译这个执行计划以在查询中找到优化它的方法,我将永远感激不尽。我还有更多的查询需要优化——我只需要一个跳板来帮助我完成第一个查询。

这是查询:

DECLARE @Param0 DATETIME     = '2013-07-29';
DECLARE @Param1 INT          = CONVERT(INT, CONVERT(VARCHAR, @Param0, 112))
DECLARE @Param2 VARCHAR(50)  = 'ABC';
DECLARE @Param3 VARCHAR(100) = 'DEF';
DECLARE @Param4 VARCHAR(50)  = 'XYZ';
DECLARE @Param5 VARCHAR(100) = NULL;
DECLARE @Param6 VARCHAR(50)  = 'Text3';

SET NOCOUNT ON

DECLARE @MyTableVar TABLE
(
    B_Var1_PK int,
    Job_Var1 varchar(512),
    Job_Var2 varchar(50)
)

INSERT INTO @MyTableVar (B_Var1_PK, Job_Var1, Job_Var2) 
SELECT B_Var1_PK, Job_Var1, Job_Var2 FROM [fn_GetJobs] (@Param1, @Param2, @Param3, @Param4, …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server optimization t-sql execution-plan

16
推荐指数
1
解决办法
2万
查看次数

我可以让 SSMS 在执行计划窗格中显示实际查询成本吗?

我正在修复 SQL Server 中多语句存储过程的性能问题。我想知道我应该花时间在哪一部分上。

我从如何阅读查询成本中了解到,它总是一个百分比吗?即使当 SSMS 被告知包括实际执行计划时,“查询成本(相对于批次)”数字仍然基于成本估算,这可能与实际情况相差甚远

我从测量查询性能:“执行计划查询成本”与“所用时间”中了解到,我可以用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 = 206 ms.
Run Code Online (Sandbox Code Playgroud)

每个语句都有一个输出消息。

我可以“轻松”(虽然不方便)将时间统计输出与 Execution plan 窗格中的逐个语句执行计划相关联,方法是对它们进行计数:第四条SQL Server Execution Times消息输出对应Query …

performance sql-server ssms execution-plan query-performance

8
推荐指数
2
解决办法
6733
查看次数

sql 可以为这个程序生成一个好的计划吗?

我读过那些本身并不总是做同样事情的过程,不会总是有一个好的计划。也就是说(如果我错了,请纠正我),如果我有一个过程,如果当天是偶数,它从表 X 中读取,否则它从表 Y 中读取,并且它第一次执行的时间是偶数,那么生成的计划将被优化对于从表 X 读取而不是从 Y 读取,即使从 Y 读取,sql 也会使用该计划,恕我直言很容易理解并尽量避免,但是作用于同一个表的过程呢。

像下面的示例(显然是一个非常简单的示例),如果它第一次运行,并且该项目确实存在,而随后的运行通常不存在(或反之亦然),我是否会得到一个“不太好”的计划这会影响性能?

CREATE PROCEDURE dbo.MyProc
(
@data    VarChar(25),
@name    VarChar(25)
)

AS

    IF NOT EXISTS (SELECT * FROM dbo.MyTable WHERE myname = @name)
    BEGIN
        INSERT dbo.MyTable (myname, mydata)
        VALUES (@name, @data)
    END
    ELSE
    BEGIN
        UPDATE dbo.MyTabel
        SET mydata = @data
        WHERE myname = @name
    END
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures optimization execution-plan sql-server-2008-r2

5
推荐指数
1
解决办法
414
查看次数

相同 SQL 语句的执行计划不同

作为此问题的背景,可以在此链接中找到详细信息。

简而言之:除了RIGHT表之外,我有 2 个几乎相同的 SQL 语句。该LEFT JOIN是相同的,并且返回的列不同,因为该表是不同的。数据库从 2008 年移至 SQL Server 2012 实例。在 2012 实例上,1 个查询在 3 秒内执行,而另一个则需要将近 2 小时才能执行。执行计划有所不同,并发布在链接上。

但是,我可以接受这两个查询并在 SQL Server 2008 服务器上执行它们,它们都在 3 秒内完成。2008 服务器上的两个执行计划与 2012 服务器上的“良好”执行计划相同。

我有一个可以工作的新语句,但它所使用的应用程序是一个使用内联 SQL 的 C# windows 应用程序。我不想打破这个 1 语句的模式。任何人都可以阐明这个问题吗?

sql-server t-sql execution-plan sql-server-2008-r2 sql-server-2012

4
推荐指数
1
解决办法
3854
查看次数