我在表T的A,B,C,D列上有一个索引
我有一个查询,它在WHERE子句中使用A,B,C从T中提取.
是否会使用索引或是否需要一个仅包含A,B,C的单独索引?
我希望能够将SQL Server查询计划从XML转换为图像.理想情况下是矢量格式,但位图可以.
有没有一个开源库来做到这一点?或者我可以使用其中一个SQL Server Management Studio DLL吗?
谢谢.
这是查询:
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
假设您有一个观点:
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倍.
有任何想法吗?
因此用例如下 - 有一些参数,我想根据这些参数从一个表或另一个表中选择数据.
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理解在某个查询中只应扫描一个表?
我有一个表用户有一堆索引.其中一个是AccountIdentifier列的唯一索引.
由于这是一个唯一索引,为什么除了索引查找之外还需要键查找?索引查找工具提示报告只返回一条记录.我也尝试将索引转换为"唯一键"类型.
alt text http://s3.amazonaws.com/brandonc.baconfile.com/pitchurs/tmp/capture_2.png
我有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
如何在MongoDB中测量查询的执行时间?我找到了Mongo-hacker插件,但它看起来像测量查询时间,包括显示所有结果的时间.在PostgreSQL中我使用Explain Analyze SELECT ...,但我没有在mongo的db.collection.find({smth})中找到任何关于时间的信息.solution()
是否可以通过配置全局禁用Rails 3.2中的新解释功能?我正在使用activerecord-sqlserver-adapter 3.2.1并且似乎有一些错误与gem的解释(显示计划)部分.
任何人都可以解释一下执行计划和解释计划之间的区别.
当我执行
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) sql ×5
sql-server ×5
t-sql ×3
performance ×2
.net ×1
activerecord ×1
indexing ×1
mongodb ×1
oracle ×1
ssms ×1
time ×1
where-clause ×1