Performance SQL Server 2005视图和子查询性能问题
我有以下两个表格: 人-约7000行 PerosnId-9字符 PersonType-Char'F'/'C'/'M'中的一个 PersonStatus-大约90K行,每个人行大约13行 身份识别 拟人-9字符 状态码-整数 LastUpdateDate-日期时间 我正在使用视图将PersonStatuses realting的最新行返回到唯一的Person行: 最新状态 以下查询:Performance SQL Server 2005视图和子查询性能问题,performance,sql-server-2005,Performance,Sql Server 2005,我有以下两个表格: 人-约7000行 PerosnId-9字符 PersonType-Char'F'/'C'/'M'中的一个 PersonStatus-大约90K行,每个人行大约13行 身份识别 拟人-9字符 状态码-整数 LastUpdateDate-日期时间 我正在使用视图将PersonStatuses realting的最新行返回到唯一的Person行: 最新状态 以下查询: SELECT DISTINCT Person.Id FROM Person WHERE Person.Id
SELECT DISTINCT Person.Id
FROM Person
WHERE Person.Id IN (SELECT PersonId
FROM LatestPersonStatuses
WHERE StatusCode = 12) AND
Person.PersonType='F'
执行大约需要一分钟的时间,因此超时,同时执行以下操作:
SELECT DISTINCT Person.Id
FROM Person
WHERE Person.Id IN (SELECT PersonId
FROM LatestPersonStatuses
WHERE StatusCode = 12)
几乎立即执行
我不明白为什么在第一个查询中添加WHERE子句:
Person.PersonType='F'
造成这样的差异
有人能告诉我吗?这是因为查询优化器决定,由于您直接处理列persontype,如果您有索引,则在该列上使用索引可能会更快,如果没有索引,则使用直接表扫描+过滤器。这与评估子查询和进行列表内比较的感知/估计成本相比,而不知道子查询中列表的度量/统计信息 即使查看您的查询,我也几乎猜到,在表列上进行扫描和筛选比在子查询下进行扫描和筛选更快,因为子查询涉及到视图的扩展 您应该能够将2005+的视图改写为
--VIEW: LatestPersonStatuses
SELECT PersonId, StatusCode
FROM (SELECT *, rownum=row_number() over (
partition by personID order by LastUpdateDate desc)
from PersonStatuses p) X
WHERE rownum = 1
这可能会对优化器有所帮助,因为查询优化器已经决定,由于您直接处理列persontype,因此在该列上使用索引(如果您有索引)可能会更快,如果没有索引,则使用直接表扫描+过滤器。这与评估子查询和进行列表内比较的感知/估计成本相比,而不知道子查询中列表的度量/统计信息 即使查看您的查询,我也几乎猜到,在表列上进行扫描和筛选比在子查询下进行扫描和筛选更快,因为子查询涉及到视图的扩展 您应该能够将2005+的视图改写为
--VIEW: LatestPersonStatuses
SELECT PersonId, StatusCode
FROM (SELECT *, rownum=row_number() over (
partition by personID order by LastUpdateDate desc)
from PersonStatuses p) X
WHERE rownum = 1
也许这会帮助优化器您的表上有索引吗?很抱歉回答一个问题,但是。。。如果你不加区分怎么办?我知道Id对个人来说是独一无二的。嘿,我第一次尝试的就是删除DISTINCT,但似乎它对复杂性没有影响。您建议创建哪些索引?我尝试在Person表中的PersonType上设置一个,在PersonStatuses表中的StatusCode上设置一个,但没有更改。查询返回多少个结果?执行计划是什么样子的?我想知道第二个计划是否与第一个计划基本相同,只是它必须进行大量的书签查找,以便检索PersonType的值来评估剩余谓词。WHERE子句让步,No WHERE子句让步。您的表上有索引吗?很抱歉回答一个问题,但是。。。如果你不加区分怎么办?我知道Id对个人来说是独一无二的。嘿,我第一次尝试的就是删除DISTINCT,但似乎它对复杂性没有影响。您建议创建哪些索引?我尝试在Person表中的PersonType上设置一个,在PersonStatuses表中的StatusCode上设置一个,但没有更改。查询返回多少个结果?执行计划是什么样子的?我想知道第二个计划是否与第一个计划基本相同,只是它必须进行大量的书签查找,以便检索PersonType的值来评估剩余谓词。WHERE子句让步,而WHERE子句让步,嘿,通过在视图的源表上添加索引,问题很容易解决,PersonStatus,在人形栏上。不知何故,它忽略了一个事实,即它没有索引,因此所有的查找都是低效的。嘿,通过在视图的源表PersonStatus的PersonId列上添加索引,问题很容易解决。不知何故,它忽略了一个事实,即它没有索引,因此所有的查找都是低效的。