如何使用索引加速非规范化表

时间:2019-06-19 11:24:41

标签: sql-server sql-server-2016

我创建了一个具有35列和360k记录的非规范化表。该表由其他8个表组成。表只有一个与其他表的内部联接。

我的主要问题是性能,对该表的查询工作如此缓慢。我也有与该表有关的全文目录。 FTS搜索也很慢。 我也陷入僵局,在活动监视器中,我看到LCK_IM_X,LCK_IM_S等待类型。

我放置了疯狂的索引,并遵循了查询执行计划。 现在我知道当有太多记录时表扫描是不好的。我很久以前就过去了,但是现在,索引扫描的成本为%80。

在下面,select的内部来自另一个表作为字符串,此查询在其最高速度下非常有效。此外,我动态地构建where子句以及其他条件。 a busy cat 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。如果有任何搜索参数,它甚至会更多。

我需要知道我应该怎么做才能更快地运行查询,对不起,如果问题很广泛。

0 个答案:

没有答案