2014-10-09 6 views
2

Я написал запрос следующим образом:Дела в запросе SELECT,

SELECT * FROM Table1 
LEFT JOIN Table2 
     ON Table2.field1 LIKE CASE WHEN Table2.field2= 1 
           THEN Table1.field1 
           WHEN Table2.field2 = 2 
           THEN Table1.field1 + '%' 
          END 

Запрос занимает слишком много выполнения time.While проверки плана, который я нашел время проводить за счет соответствия. Как я могу перезаписать оператор CASE в SELECT, чтобы свести к минимуму время выполнения?

+2

Ваше соединение с использованием оператора LIKE, который будет выполнять таблицы каждый раз. Я не вижу способа улучшить время выполнения, если ваше условие соединения настолько переменное. – Matt

+0

+1 @Matt. Вероятно, вам лучше не разделять код на логику ветвления, если производительность достаточно плоха. Просто будьте осторожны с планированием кэширования, если этот код живет в proc ... вам может потребоваться вложить некоторые procs с разделенной логикой, чтобы обеспечить надлежащее кэширование/производительность плана. – DCaugs

ответ

0

Нужно ли быть таким? вы можете использовать равные. Мысль заключается в том, что вы можете просто использовать подстроку или что-то в качестве части второго случая для создания psudo-версии вашей текущей проверки. Это будет выглядеть как этот

SELECT * FROM Table1 
LEFT JOIN Table2 
    ON Case WHEN Table2.field2= 1 
      Then Table2.field1 = Table1.field1 
      When Table2.field2 = 2 
      Then Substring(Table2.field1, 1, Len(Table1.field1)) = Table1.Field1 
    END 

немного сомнительный на, если это будет работать, как это, хотя, в основном из-за отсутствия дела еще.

1

Я хотел бы попробовать с этим присоединиться:

SELECT 
    * 
FROM 
    Table1 LEFT JOIN Table2 
    ON 
    (Table2.field2=1 AND Table2.field1=Table1.field1) 
    OR 
    (Table2.field2=2 AND Table2.field1 LIKE Table1.field1 + '%') 
0

Я хотел бы попробовать ниже запрос:

SELECT * 
    FROM Table1 
    LEFT JOIN Table2 
    ON Table2.field1 = Table1.field1 
WHERE Table2.field2 = 1 
UNION ALL 
SELECT * 
    FROM Table1 
    LEFT JOIN Table2 
    ON Table2.field1 LIKE Table1.field1 + '%' 
WHERE Table2.field2= 2 

Убедитесь field1 индексируется. Если поле2 имеет только 2 возможных значения, его не нужно индексировать.

Смежные вопросы