标签: execution-plan

如何让一组开发人员能够查看查询计划,而不能运行跟踪或查看服务器状态?

我有一组 5 名开发人员,他们需要能够查看他们为数据库编写的查询计划,并且仅适用于该数据库。我拒绝让他们成为系统管理员的成员。我不希望他们能够在此服务器上运行跟踪,也不希望他们能够运行 dmv。

这 5 位开发人员是 Windows 组的成员。我已经让他们成为 db_owner 的成员。

这是我发现的:

  • 具有 DENY 服务器权限 ALTER TRACE 的服务器主体在尝试查看 SHOWPLAN 输出时将遇到错误 262
  • 即使数据库主体具有 SHOWPLAN 数据库权限的 GRANT,也会发生这种情况
  • 发生这种情况是因为 ALTER TRACE 权限隐含了 SHOWPLAN 权限
  • 如果数据库主体是数据库所有者,则不会发生这种情况
  • 具有 GRANT 服务器权限 ALTER TRACE 的服务器主体将能够获得 SHOWPLAN 输出,而无需为单个数据库显式授予 SHOWPLAN

只有 sysadmin 并且如果您映射到 db 中的 dbo 用户名,它不会执行检查。

有没有办法让这些开发人员能够在没有系统管理员角色或授予更改跟踪或授予查看服务器状态的情况下查看计划?

security sql-server permissions execution-plan

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

相同 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
查看次数

SQL Server:使用 XPath 性能解析

我有一个用户界面,允许用户选择他们想要过滤结果的某些数据点。有位置、部门等内容。一旦他们选择了所有选项,我就会生成一个 XML 字符串,并将其传递给我的存储过程。

从那里,例如,对于位置,我创建了一个临时表并将用户选择的所有位置转储到该表中,然后我稍后加入我的数据。

在运行执行计划时,我注意到解析过滤器数据的 5 个左右的查询中的每一个都花费了大约 12%,这超过了查询的 60%,只是为了确定我们将要过滤的数据。

DECLARE @tmLocations TABLE (
    location VARCHAR (100));
BEGIN
    INSERT INTO @tmLocations
    SELECT ParamValues.x1.value('location[1]', 'VARCHAR(200)')
    FROM   @xml.nodes('data/teammateLocations/locations') AS ParamValues(x1);
END
Run Code Online (Sandbox Code Playgroud)

是否有另一种从 XML 中提取数据的方法或改进上述查询的方法,以便运行成本不高?设置数据比实际过滤数据的成本更高,这确实会降低性能。

sql-server-2008 sql-server stored-procedures t-sql execution-plan

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

执行计划有 TOP 运算符,用于没有 TOP 或 ORDER BY 的查询

在此处输入图片说明我有按月临时表的产品销售。(更大的历史表的子集)我正在运行查询以查找在指定的 6 个月范围内之前几个月未售出的新产品。因此,以 1 月为基础,在 2 月向我展示所有未在 1 月销售中销售的新产品。3 月所有未售出的新产品 1 月或 2 月销售等。前 5 个月查询返回次秒。第 6 个月,大约需要 5 分钟。比较执行计划,在第 6 个月,它显示我的执行计划中的 Top 运算符花费了额外的时间。但我没有在选择中排序或使用 Top X。我的查询中是什么导致了这种情况?我可以等 5 分钟,因为它是一次性请求,但我更多是从学习的角度询问,我想了解它为什么添加到 Top 运算符。提前致谢。

select divn_nbr, dept_nbr, vendorNumber, pid, nrfcolorNumber, periodcode    
from ##tmpSFA a 
where periodCode = '201512' 
and not exists  
(   
    select 1 from ##tmpSFA b
    where ISNULL(a.divn_nbr, -99) = isnull(b.divn_nbr, -99)
    and isnull(a.dept_nbr, -99) = isnull(b.dept_nbr, -99)
    and isnull(a.vendorNumber, -99) = isnull(b.vendorNumber, -99)
    and isnull(LTRIM(rtrim(upper(a.pid))), -99) = isnull(LTRIM(rtrim(upper(b.pid))), -99)
    and isnull(a.nrfcolorNumber, -99) …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan sql-server-2012 top

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

允许非系统管理员用户查看 SQL Server 执行计划

这可能吗 ?在 SQL Server 2012+ 上,授予非 sysadmin 用户访问权限以查看执行计划?并且只能对选定的数据库执行此操作吗?

security sql-server permissions execution-plan sql-server-2012

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

测量存储过程的编译时间

我需要测量 MSSQL-2012 编译存储过程所需的时间。

是否可以?

sql-server execution-plan sql-server-2012

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

为什么我的执行计划(有时)包括左连接?

我发现了一个类似的问题,我知道为了查询表格

SELECT COUNT(1)
FROM foo f
LEFT OUTER JOIN bar b ON f.Value = b.Value AND f.Value = b.Value2
Run Code Online (Sandbox Code Playgroud)

要在不接触的情况下执行bar,需要在有问题的两列上有一个唯一索引。

事实上,到目前为止,这有效,表被定义为:

CREATE TABLE [dbo].[Foo](
    [Value] [varchar](255) NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Bar](
    [Value] [varchar](1024) NULL,
    [Value2] [varchar](1024) NULL
)

CREATE UNIQUE CLUSTERED INDEX [IX] ON [dbo].[Bar]
(
    [Value] ASC,
    [Value2] ASC
)
Run Code Online (Sandbox Code Playgroud)

查询计划没有触及bar,太好了。

在我探索为什么这在我编写的某些应用程序的实际查询中不起作用时,我将那里的查询简化为以下简单的测试,并且查询计划器无法将其从桌子上移开bar

WITH numbers AS (
    SELECT 1 AS i
    UNION ALL SELECT i + 1
    FROM numbers …
Run Code Online (Sandbox Code Playgroud)

join sql-server execution-plan sql-server-2014

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

如何避免整数列的隐式转换

  SELECT [BusinessEntityID],[NationalIDNumber],[LoginID],[OrganizationNode]
  FROM [AdventureWorks2014].[HumanResources].[Employee]
  where BusinessEntityID = 5
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在实际执行计划中执行查询后,我得到了 SQL Server 调用的 convert_implicit() 函数。

  SELECT [BusinessEntityID],[NationalIDNumber],[LoginID],[OrganizationNode]
  FROM [AdventureWorks2014].[HumanResources].[Employee]
  where BusinessEntityID = convert(int,5)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

显然,当我将标量值显式转换为整数类型时,不会调用 convert_implicit() 函数。有什么方法可以避免在不使用显式转换的情况下对标量 int 值进行隐式转换。另外我想知道隐式转换、显式转换和根本没有转换之间的性能差异。

sql-server optimization execution-plan type-conversion

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

为什么 PostgreSQL 在将数值与 bigint 列进行比较时执行 seq 扫描?

给定一个vp具有列timestamp类型的表bigint和一个btree索引timestamp,为什么 Postgres 会忽略索引并在timestamp与浮点值比较时运行 seq 扫描,当索引扫描会产生相同的结果时?

整数比较:

SELECT * FROM vp WHERE vp.timestamp > 1470752584需要48 毫秒

 在 vp 上使用 vp_ts_idx 进行索引扫描(cost=0.57..257.87 rows=2381 width=57)(实际时间=0.014..38.669 rows=80323 loops=1)
   索引条件:(“时间戳”> 1470752584)
 总运行时间:48.322 毫秒

数值比较:

SELECT * FROM vp WHERE vp.timestamp > 1470752584.1需要103 秒,因为它忽略vp_ts_idx并执行整个表的 seq 扫描:

  vp 上的 Seq Scan (cost=0.00..7378353.16 rows=95403915 width=57) (实际时间=62625.420..103122.701 rows=98240 loops=1)
   过滤器:(("timestamp")::numeric > 1470752584.1)
   过滤器删除的行:285945491
 总运行时间:103134.333 毫秒

背景:相比于最近的车辆位置查询timestampEXTRACT(EPOCH …

postgresql performance execution-plan postgresql-9.3 query-performance

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

PostgreSQL 在同一列上存在两种不同类型的索引时的行为

如果我在同一列上创建两个(或多个)不同类型的索引,PostgreSQL 的行为如何?

就我而言,我想将 B 树索引与tsvector列上的 GIN 进行比较。我知道 GIN 专门用于tsvector. 奇怪的是,如果我创建 B 树索引,PostgreSQL 不会抱怨,但我看到查询计划器不使用它。我还可以创建 GIN 索引(不删除 B 树索引),现在规划器使用新创建的索引。该列现在有两个索引,但只使用了其中一个。

即使存在两个以上的索引,用于选择索引类型的标准是什么?为什么 PostgreSQL 不告诉我 a 上的 B 树索引tsvector是无用的,并且不会永远不会被计划者使用?

更新
GIN 索引仅用于某些检查条件,例如my_tsvector IS NOT NULL但(显然)不适用于my_tsvector @@ '...'::tsquery.

postgresql index execution-plan operator

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