2017-06-12 44 views
1

我想修复以下查询的某些性能问题。从sql server中的大型数据集中筛选数据的性能调整

  • Tbl_A拥有65万行
  • Tbl_B有两行

我需要

SELECT COUNT(*) 
FROM Tbl_A R1 WITH (NOLOCK) 
     INNER JOIN Tbl_B PBD 
      ON PBD.Indicators = CASE R1.Indicator WHEN 'Y' THEN 'B' 
               WHEN 'N' THEN 'D'  
               WHEN '1' THEN 'B' 
               WHEN '0' THEN 'D'  
               ELSE R1.Indicator  
          END 

我已经使用&试图Tbl_b的值来过滤Tbl_A exists代替加入,但我无法找到任何性能优势。请协助。

+1

可能不是性能改进,但可以改善查询,可以将WHEN作为'WHEN'Y'或'1'然后'B''''当'N'或'0'结合'THEN'D'' –

+0

不,它不起作用 – vignesh

+0

我想这是一个n:m的关系?我可以在tbl_a中多次找到相同的指示符,并在tbl_b中多次找到相同的指示符? –

回答

3

在这里没有太多的事情可以做。当然你应该在Tbl_A.IndicatorTbl_B.Indicators上有索引。

的性能提升我看到将是一个持久化计算列中的唯一选择:

ALTER TABLE tbl_a ADD pbd_indicator AS (CASE indicator WHEN 'Y' THEN 'B' 
                 WHEN 'N' THEN 'D'  
                 WHEN '1' THEN 'B' 
                 WHEN '0' THEN 'D'  
                 ELSE Indicator  
             END) PERSISTED; 

添加相关指标:

CREATE INDEX idx_tbl_a_pbd ON tbl_a(pbd_indicator); 

并相应地更改查询:

SELECT COUNT(*) 
FROM tbl_a r1 
INNER JOIN tbl_b pbd ON pbd.indicators = r1.pbd_indicator; 
0

试试这个,加入case语句可能需要大量的逻辑读取,而不是在内部查询中使用case语句。

SELECT COUNT(*) 
FROM (
    SELECT CASE Indicator 
      WHEN 'Y' 
       THEN 'B' 
      WHEN 'N' 
       THEN 'D' 
      WHEN '1' 
       THEN 'B' 
      WHEN '0' 
       THEN 'D' 
      ELSE Indicator 
      END AS Indicator 
    FROM Tbl_b 
    ) R1 
INNER JOIN Tbl_a PBD 
    ON PBD.Indicators = R1.indicator 
+0

没有相同的性能 – vignesh

相关问题