标签: sql-execution-plan

如果不使用所有列,我的索引会被使用吗?

我在表T的A,B,C,D列上有一个索引

我有一个查询,它在WHERE子句中使用A,B,C从T中提取.

是否会使用索引或是否需要一个仅包含A,B,C的单独索引?

sql sql-server sql-execution-plan

16
推荐指数
3
解决办法
7223
查看次数

有没有办法以编程方式将SQL Server查询计划转换为图像?

我希望能够将SQL Server查询计划从XML转换为图像.理想情况下是矢量格式,但位图可以.

有没有一个开源库来做到这一点?或者我可以使用其中一个SQL Server Management Studio DLL吗?

谢谢.

.net sql-server ssms sql-execution-plan

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

为什么这是一个索引扫描而不是索引寻求?

这是查询:

SELECT      top 100 a.LocationId, b.SearchQuery, b.SearchRank
FROM        dbo.Locations a
INNER JOIN  dbo.LocationCache b ON a.LocationId = b.LocationId
WHERE       a.CountryId = 2
AND         a.Type = 7
Run Code Online (Sandbox Code Playgroud)

位置索引:

PK_Locations:

LocationId

IX_Locations_CountryId_Type:

CountryId,Type

LocationCache索引:

PK_LocationCache:

LocationId

IX_LocationCache_LocationId_SearchQuery_SearchRank:

LocationId,SearchQuery,SearchRank

执行计划:

在此输入图像描述

所以它正在使用覆盖索引做一个关于位置的索引搜索,很酷.

但是为什么它在LocationCache覆盖索引上进行索引扫描

覆盖索引在索引中具有LocationId,SearchQuery,SearchRank(而不是"包含的列").

将鼠标悬停在索引扫描上:

在此输入图像描述

此查询需要进入由自动完成插件使用的SQL Server FTS目录提供的索引视图,因此需要100%优化.

目前,上述查询需要3秒钟.它应该<0.

有任何想法吗?

t-sql indexing performance sql-server-2008 sql-execution-plan

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

为什么在视图外部放置WHERE子句会产生糟糕的性能

假设您有一个观点:

CREATE VIEW dbo.v_SomeJoinedTables AS
SELECT
    a.date,
    a.Col1,
    b.Col2,
    DENSE_RANK() 
      OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b on a.date = b.date
Run Code Online (Sandbox Code Playgroud)

我发现了以下的表现:

SELECT *
FROM v_SomeJoinedTables
WHERE date > '2011-01-01'
Run Code Online (Sandbox Code Playgroud)

比...差很多

SELECT *, 
   DENSE_RANK() 
     OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b ON a.date = b.date
WHERE a.date > '2011-01-01'
Run Code Online (Sandbox Code Playgroud)

我很惊讶这两个语句的查询计划不一样.

我也尝试使用内联表值函数,但查询仍然比我复制和粘贴视图逻辑的代码长100-1000倍.

有任何想法吗?

t-sql sql-server-2005 where-clause sql-execution-plan

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

表函数中的条件UNION ALL

因此用例如下 - 有一些参数,我想根据这些参数从一个表或另一个表中选择数据.

create table dbo.TEST1 (id int primary key, name nvarchar(128))
create table dbo.TEST2 (id int primary key, name nvarchar(128))
Run Code Online (Sandbox Code Playgroud)

所以我创建了这样的函数:

create function [dbo].[f_TEST]
(
    @test bit
)
returns table
as
return (
    select id, name from TEST1 where @test = 1

    union all

    select id, name from TEST2 where @test = 0
)
Run Code Online (Sandbox Code Playgroud)

当我使用常量运行它时,执行计划很棒 - 只扫描一个表

select * from dbo.f_TEST(1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是,当我使用变量时,计划并不是那么好 - 两个表都被扫描

declare @test bit = 1

select * from dbo.f_TEST(@test)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

那么是否有任何提示(或技巧)强制SQL Server理解在某个查询中只应扫描一个表?

sql t-sql sql-server sql-execution-plan sql-server-2016

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

为什么这个SQL查询会进行密钥查找?

我有一个表用户有一堆索引.其中一个是AccountIdentifier列的唯一索引.

由于这是一个唯一索引,为什么除了索引查找之外还需要键查找?索引查找工具提示报告只返回一条记录.我也尝试将索引转换为"唯一键"类型.

alt text http://s3.amazonaws.com/brandonc.baconfile.com/pitchurs/tmp/capture_2.png

sql sql-server query-optimization sql-execution-plan

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

DELETE查询非常慢

我有SQL性能问题.出于突发原因,以下查询非常缓慢:

我有两个列表,其中包含某个表的Id.如果Id已存在于第二个列表中,我需要删除第一个列表中的所有记录:

DECLARE @IdList1 TABLE(Id INT)
DECLARE @IdList2 TABLE(Id INT)

-- Approach 1
DELETE list1
FROM @IdList1 list1
INNER JOIN @IdList2 list2 ON list1.Id = list2.Id

-- Approach 2
DELETE FROM @IdList1
WHERE Id IN (SELECT Id FROM @IdList2)
Run Code Online (Sandbox Code Playgroud)

这两个列表可能包含超过10,000条记录.在这种情况下,两个查询都需要超过20秒才能执行.

执行计划也显示了一些我不理解的东西.也许这就解释了为什么它如此缓慢: 查询两个查询

我用10,000个连续的整数填充了两个列表,因此两个列表都包含值1-10.000作为起始点.

正如您所看到的,两个查询显示@ IdList2 实际行数为50.005.000 !!.@ IdList1是正确的(实际行数是10.000)

我知道还有其他解决方案如何解决这个问题.就像填写从第一个列表中删除的第三个列表一样.但我的问题是:

为什么这些删除查询这么慢,为什么我会看到这些奇怪的查询计划?

sql sql-server performance table-variable sql-execution-plan

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

测量Mongo中的查询时间

如何在MongoDB中测量查询的执行时间?我找到了Mongo-hacker插件,但它看起来像测量查询时间,包括显示所有结果的时间.在PostgreSQL中我使用Explain Analyze SELECT ...,但我没有在mongo的db.collection.find({smth})中找到任何关于时间的信息.solution()

time mongodb sql-execution-plan

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

在Rails 3.2中禁用说明

是否可以通过配置全局禁用Rails 3.2中的新解释功能?我正在使用activerecord-sqlserver-adapter 3.2.1并且似乎有一些错误与gem的解释(显示计划)部分.

sql activerecord ruby-on-rails sql-execution-plan

14
推荐指数
2
解决办法
4024
查看次数

解释计划和执行计划之间的区别

任何人都可以解释一下执行计划和解释计划之间的区别.

当我执行

 set autotrace traceonly;
 select * from emp where empno=7369;

Execution Plan
----------------------------------------------------------
  0       SELECT STATEMENT Optimizer Mode=ALL_ROWS (Cost=1 Card=1 Bytes=38)
  1    0    TABLE ACCESS BY INDEX ROWID SCOTT.EMP (Cost=1 Card=1 Bytes=38)
  2    1      INDEX UNIQUE SCAN SCOTT.PK_EMP (Cost=0 Card=1)


 Explain Plan

 explain plan for select * from emp where empno=7369;
 select * from table(dbms_xplan.display);

Plan hash value: 2949544139

--------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | …
Run Code Online (Sandbox Code Playgroud)

oracle sql-execution-plan

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