2015-03-03 70 views
0

我有这样的SQL查询的SQL查询的性能:与是否存在

IF NOT EXISTS (SELECT TOP 1 RowId 
       FROM dbo.Cache AS C 
       WHERE StringSearched = @pcpnpi 
         AND colName = 'pcpnpi' 
         AND ModifiedAt > (SELECT ModifiedAt 
             FROM dbo.Patients AS p 
             WHERE P.RowID = C.RowID)) 
    BEGIN 
     SELECT @constVal = FunctionWeight 
     FROM dbo.FunctionWeights 
     WHERE FunctionWeights.FunctionId = 33; 

     INSERT INTO #Temp2 
        (RowNumber,ValFromUser,ColumnName,ValFromFunc, 
        FuncWeight,percentage) 
     SELECT RowNumber,@pcpnpi,'pcpnpi',PercentMatch, 
      @constVal,PercentMatch * @constVal 
     FROM dbo.Matchpcpnpi (@pcpnpi); 
    END 
ELSE 
    BEGIN 
     INSERT INTO #Temp2 
        (RowNumber,ValFromUser,ColumnName,Percentage) 
     SELECT RowId,StringSearched,ColName,PercentMatch 
     FROM dbo.Cache AS C 
     WHERE StringSearched = @pcpnpi 
      AND colName = 'pcpnpi' 
      AND ModifiedAt > (SELECT ModifiedAt 
           FROM dbo.Patients AS p 
           WHERE P.RowID = C.RowID) 
    END 

以上if语句是为了避免已经被之前搜索和MatchPercent已计算出的字符串不必要的外观窗口。在这种情况下,它直接从缓存表中检索。

上面的sql查询基本上是针对一个特定的列,并且该查询只有columnName,并且其值会随着该过程中的许多其他列而重复更改。

if Exists检查显然意味着查询性能可以提高,但是性能下降可能是由于额外的检查。 缓存表实际上是为了提高性能,额外的检查已经毁了它。 请问有没有办法简化上述查询?任何方向相同将有所帮助。 感谢

+0

顺便说一句:可怕的语法。 – reporter 2015-03-03 13:19:56

+1

您是否考虑过在数据被修改时从缓存中删除行?这会减少你现在要检查时间字段的I/O。此外,对于过去24小时内的同一事件,这似乎至少是第3个问题,也许您可​​以更新原始问题... – 2015-03-03 13:22:02

回答

1

首先,考虑在exists这个查询:

select Top 1 RowId 
from dbo.Cache as C 
where StringSearched = @pcpnpi and 
     colName = 'pcpnpi' and 
     ModifiedAt > (Select ModifiedAt FROM dbo.Patients p WHERE P.RowID = C.RowID)) 

出于性能考虑,你想在cache(StringSearched, colName, ModifiedAt, RowId)Patients(RowId)指标。

但是,您正在运行此查询两次。我会建议一个更类似于如下的结构:

declare @RowId . . . ; -- I don't know the type 

select Top 1 @RowId = RowId 
from dbo.Cache as C 
where StringSearched = @pcpnpi and 
     colName = 'pcpnpi' and 
     ModifiedAt > (Select ModifiedAt FROM dbo.Patients p WHERE P.RowID = C.RowID)); 

if (@RowId) is null . .. 
else . . . 
+0

谢谢。但是,您可以指定是否在这些列上建议聚集索引或非聚集索引? – Simran 2015-03-03 13:17:39

+1

@SImran。 。 。除非另有指定,否则索引是非群集的。聚簇索引通常用于主键。 – 2015-03-05 01:22:32

2

首先根据存在条件插入#temp2。如果插入记录计数为零,则执行另一次插入。尝试这个。

INSERT INTO #Temp2 
      (RowNumber,ValFromUser,ColumnName,Percentage) 
SELECT RowId,StringSearched,ColName,PercentMatch 
FROM dbo.Cache AS C 
WHERE StringSearched = @pcpnpi 
     AND colName = 'pcpnpi' 
     AND ModifiedAt > (SELECT ModifiedAt 
         FROM dbo.Patients AS p 
         WHERE P.RowID = C.RowID) 

IF @@ROWCOUNT = 0 
    BEGIN 
     SELECT @constVal = FunctionWeight 
     FROM dbo.FunctionWeights 
     WHERE FunctionWeights.FunctionId = 33; 

     INSERT INTO #Temp2 
        (RowNumber,ValFromUser,ColumnName,ValFromFunc, 
        FuncWeight,percentage) 
     SELECT RowNumber,@pcpnpi,'pcpnpi',PercentMatch, 
      @constVal,PercentMatch * @constVal 
     FROM dbo.Matchpcpnpi (@pcpnpi) 
    END 
相关问题