2015-03-03 3 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 

выше, если заявление предназначается, чтобы избежать ненужных выглядеть окна для строк, которые уже искали раньше и MatchPercent был рассчитан. В этом случае он непосредственно извлекается из таблицы Cache.

Выше sql-запрос в основном для одного конкретного столбца, и этот же запрос с единственным именем columnName и его изменение значения повторяется для многих других столбцов в процедуре.

Очевидно, что проверка if Exists означала, что производительность запросов может улучшиться, однако производительность снизилась, вероятно, из-за дополнительных проверок. Таблица кеша, которая на самом деле предназначена для повышения производительности, дополнительные проверки испортили ее. Есть ли способ упростить вышеуказанный запрос, пожалуйста? Любые указания на том же помогут. Благодаря

+0

Кстати: ужасный синтаксис. – reporter

+1

Вы считали удаление строк из кеша при изменении данных? Это уменьшит ввод-вывод, который вы будете выполнять для проверки полей времени. Также это, по-видимому, по крайней мере третий вопрос для того же самого в течение последних 24 часов, возможно, вы могли бы обновить исходный вопрос ... –

ответ

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

+1

@SImran. , , Индекс не кластеризуется, если не указано иное. Кластеризованный индекс обычно используется для первичного ключа. –

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