标签: execution-plan

如何将 Convert() 评估延迟到加入之后

以下查询转换表示 13k 行 x 2 列的打包 CSV 的单个字符串。A 列是一个 bigint。B 列是一个smallint。

declare
    @dataCsv nvarchar(max) = '29653,36,19603,36,19604,36,29654,36';  -- abbreviated, actually 13k rows

  with Input as
  (
      select Value,
             Row = row_number() over (order by (select null)) - 1
      from string_split(@dataCsv, ',') o
  )
  --insert into PubCache.TableName
  select 78064 as CacheId,
         convert(bigint, i.Value) as ObjectId,
         convert(smallint, i2.Value) as BrandId
    from Input i
    inner hash join Input i2    -- hash to encourage string_split() only once per column
      on i2.Row = i.Row + 1 …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan type-conversion string-splitting

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

了解和优化 SQL Server 中多个数据库的重复查询哈希

我正在使用托管数千个数据库的 SQL Server 实例。每个数据库对应不同的客户,但它们都共享相同的模式。

最近,我观察到许多查询具有相同的查询哈希。经过进一步调查,我发现虽然查询具有相同的文本,但它们是针对不同的数据库执行的。

据我了解,由于每个查询的上下文都是特定于数据库的,因此重复的查询哈希是可以预料的。不过,我很想知道我的理解是否正确。

此外,我有兴趣探索优化此设置的选项。具体来说,是否有一种方法可以整合不同数据库之间相同查询的执行计划,或者由于不同的数据库上下文而无法实现这一点?

任何有关此事的见解或建议将不胜感激。

预先感谢您的帮助!

sql-server execution-plan

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

为什么在 freeproccache 之后重新编译查询提示会导致相同 adhoc 语句的不同计划?

这是在 SQL 2005 SP2 上,但我怀疑这通常适用于所有查询提示。

我有一个临时的 sql 语句,它仅仅因为 OPTION(重新编译)而获得不同的查询计划。批处理语句永远不会(实际上)被重用,因为它使用非参数化动态 sql 生成,其中语句随日期/其他参数而变化。我已经通过检查缓存的 plan_handle 确认了这种情况,在批量更改时总是使用不同的 ID。

当我执行 dbcc freeproccache 时,我希望我为语句获得的查询计划与添加了“选项(重新编译)”查询提示的查询计划完全相同。但它不是,它实际上完全不同(要快得多)。

有谁知道为什么添加查询提示会导致引擎选择不同的查询计划?

声明是这样的

dbcc freeproccache
go
sp_executesql ' 
declare @begindate datetime
declare @enddate datetime
select @begindate='1/1/2011'
select @enddate='2/1/2011'
select count(*) from tableA where tableA.datecolumn between @begindate and @enddate 
and exists( 
select A
union all select B
union all select C
)'
Run Code Online (Sandbox Code Playgroud)

我所要做的就是更改语句以使用重新编译查询提示,然后我会得到不同的(更好的)查询计划。

dbcc freeproccache
go
sp_executesql ' 
declare @begindate datetime
declare @enddate datetime
select @begindate='1/1/2011'
select @enddate='2/1/2011'
select count(*) from tableA where tableA.datecolumn …
Run Code Online (Sandbox Code Playgroud)

performance sql-server execution-plan

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

SQL Server 2008 R2 sys.dm_exec_sql_text 问题

如果我在我们的生产服务器上运行以下查询:

SELECT DISTINCT TOP 10
t.TEXT QueryName,
s.execution_count AS ExecutionCount,
s.max_elapsed_time / 100000 AS MaxElapsedTime,
ISNULL(s.total_elapsed_time / s.execution_count, 0) / 100000 AS AvgElapsedTime,
s.creation_time AS LogCreatedOn,
ISNULL(s.execution_count / DATEDIFF(s, s.creation_time, GETDATE()), 0) AS FrequencyPerSec
,s.plan_handle, s.plan_generation_num
FROM sys.dm_exec_query_stats s
CROSS APPLY sys.dm_exec_sql_text( s.sql_handle ) t
ORDER BY
s.max_elapsed_time / 100000 DESC
Run Code Online (Sandbox Code Playgroud)

我的主要查询是“创建过程.......”这是否意味着 sql server 重新编译这个存储过程不止一次?

execution-plan sql-server-2008-r2

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

执行计划与存储过程不匹配

下面是一个存储过程,用于计算一个月内制作的小部件数量。如果没有制作小部件,则不存在任何记录。

执行计划显示INNER JOIN了 M 和 A 表中的一个,在语句中我正在执行一个LEFT OUTER JOIN.

我想计算一个时间范围内制作的小部件数量,将其加入月份表(1 月至 12 月),并将结果显示在 SSRS 报告中。加入是因为我无法获得不存在的COUNT数据。目前我得到:

MonthName   Widget Count
February    2
March       3
April       4
May         6
June        5
July        4 
August      6
September   2
October     4
November    1
December    2
Run Code Online (Sandbox Code Playgroud)

我希望列表中没有包含小部件的月份。

这是代码:

DECLARE @OName varchar(50)
DECLARE @Start_Date DATE 
DECLARE @End_Date DATE

SET @OName = 'John'
SET @Start_Date = '01/01/2012'
SET @End_Date   = '12/31/2012'

SELECT   M.[MonthName]
    ,COUNT(A.[Widget_ID]) AS 'Widget Count'
FROM [Connector].dbo.[Months] AS M 
        LEFT …
Run Code Online (Sandbox Code Playgroud)

t-sql execution-plan sql-server-2012

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

查询在哪个服务器上执行?

给定两个 Microsoft SQL 服务器:

假设ServerA有一个名为“View1”的视图: SELECT * FROM ServerB.database.dbo.Table1 WHERE Column1 IN (1,2,3)

和一个存储过程“sp_Foo”: SELECT * FROM View1 WHERE Column1=1

当我执行时EXEC sp_Foo,哪个查询在哪个服务器上执行?都是在ServerB上执行的吗?都在 ServerA 上?还是在ServerB上执行的视图查询和在ServerA上执行的SP查询?

execution-plan sql-server-2012 distributed-transactions

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

如何判断查询计划重用何时导致性能问题

在调查性能问题时,一位同事建议运行 DBCC FREEPROCCACHE 来清除计划缓存。在注意到重启后性能有所提高后,他得出了这个结论。

这感觉像是一种相当快速和肮脏的方法 - 有没有更确定、更明确的方法来确定清除计划缓存是否是最好的方法?做出这个决定的错误可能会导致性能问题。

如果这个问题太模糊,请道歉:)

谢谢!

performance sql-server execution-plan

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

有没有办法将执行计划保存在 PostgreSQL 的文件中?

通过将计划保存在文件中,我并不是要查看它,而是强制优化器使用保存的计划来执行某些查询。

例如,如果优化器选择对两表查询进行哈希连接,而我设法强制优化器使用嵌套循环连接,是否有任何方法可以保存嵌套循环连接计划并让优化器接下来使用它我执行相同查询的时间?

postgresql optimization execution-plan

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

使用 TVP 了解执行计划

我有一些运行缓慢的查询(按月分组的 100 万条记录中的 8 秒),并且一直试图理解执行计划。我们使用大约 10 个 TVP 来发送一组用户选择的过滤器,我有一个索引视图,占查询成本的 84%。

执行计划比较大,不能上传到这里,所以上传到这里了

我花了很多时间来尝试优化这些查询(其中有 14 个,但每个查询的核心都大同小异)并且希望任何人在阅读它们时提出建议或提示。我还实现了实际执行计划建议的查询,但查询速度慢了 5 倍?

performance sql-server execution-plan sql-server-2012 table-valued-parameters query-performance

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

尽管在列上排序了索引,但为什么查询计划仍然对表进行排序?

我正在使用 Postgres 9.1 我要加入两个表:

wikidb=> \d page
                         Table "public.page"
        Column         |     Type      |          Modifiers           
-----------------------+---------------+------------------------------
 page_id               | bigint        | not null
 page_namespace        | integer       | not null default 0
 page_title            | text          | not null default ''::text
 [...]
Indexes:
    [...]
    "page_page_namespace_page_title_idx" UNIQUE, btree (page_namespace, page_title)

wikidb=> \d pagelinks
                 Table "public.pagelinks"
      Column       |  Type   |         Modifiers          
-------------------+---------+----------------------------
 pl_from           | bigint  | not null default 0::bigint
 pl_namespace      | integer | not null default 0
 pl_title          | text    | not null default ''::text …
Run Code Online (Sandbox Code Playgroud)

postgresql performance optimization execution-plan postgresql-9.1 query-performance

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