Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance SQL Server 2005视图和子查询性能问题_Performance_Sql Server 2005 - Fatal编程技术网

Performance SQL Server 2005视图和子查询性能问题

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

我有以下两个表格:

人-约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  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列上添加索引,问题很容易解决。不知何故,它忽略了一个事实,即它没有索引,因此所有的查找都是低效的。