我创建了一个具有35列和360k记录的非规范化表。该表由其他8个表组成。表只有一个与其他表的内部联接。
我的主要问题是性能,对该表的查询工作如此缓慢。我也有与该表有关的全文目录。 FTS搜索也很慢。 我也陷入僵局,在活动监视器中,我看到LCK_IM_X,LCK_IM_S等待类型。
我放置了疯狂的索引,并遵循了查询执行计划。 现在我知道当有太多记录时表扫描是不好的。我很久以前就过去了,但是现在,索引扫描的成本为%80。
在下面,select的内部来自另一个表作为字符串,此查询在其最高速度下非常有效。此外,我动态地构建where子句以及其他条件。 https://imgur.com/a/ijOUYeY
SET @Sql=';WITH TempResult AS(Select '+(SELECT STUFF((SELECT ',' +DBFieldName FROM TableFields where TableFields.TableID=3 FOR XML PATH('')), 1, 1, ''))+',
0 as [DeviceChange],
0 as [DeviceReturn],
0 as [SNORepeat]
from DenormalizedTable
inner join Companies On Companies.CompanyID=DenormalizedTable.CompanyID
WHERE (@state is null or DenormalizedTable.StateID=@state)
AND ((@status = -1 AND DenormalizedTable.Status IN(0,1,10,11,4)) OR (@status=1 AND DenormalizedTable.Status IN(1,4,10,11)) OR
(@status=2 AND DenormalizedTable.Status IN (0))) AND (@CategoryID is null or DenormalizedTable.CategoryID=@CategoryID)
AND (DenormalizedTable.CompanyID=@companyID OR Companies.SubCompanyOf=@companyID)
'+ ( CASE WHEN @CustomSearchParam='' THEN '' ELSE (Select dbo.[perf_whereBuilder](@CustomSearchParam)) END)+'
AND (@technicianID is null or DenormalizedTable.JobOrderID IN (Select AttendedStaff.JobOrderID from AttendedStaff Where AttendedStaff.StaffID=@technicianID))
AND (@FilterStartDate is null or convert(varchar, JobOrder_PerfTable.StartDate, 20) between @FilterStartDate and @FilterEndDate)
), TotalCount AS (Select COUNT(*) as TotalCount from TempResult)
Select * from TempResult, TotalCount
order by 1 desc
OFFSET @skip ROWS
FETCH NEXT @take ROWS ONLY;';
当我运行sp时,需要5秒钟才能加载almos。如果有任何搜索参数,它甚至会更多。
我需要知道我应该怎么做才能更快地运行查询,对不起,如果问题很广泛。