2015-05-27 5 views
-2

У меня есть код, который работает очень медленно. Псевдокод ниже.Оптимизируйте SQL-код, когда оператор

if flag = 'y' 
    Begin 
     insert into W (a, b, c) 
     select (case 
        when creditCard = 'N' then dbo.GetDecimal(W.USD) 
        when creditCard ='Y' then -dbo.GetDecimal(W.USD) end, 
       case 
        when creditCard = 'N' then dbo.GetDecimal(W.EUR) 
        when creditCard ='Y' then -dbo.GetDecimal(W.EUR) end, 
       A.c) 
     from table Wallet W 
     left outer join Country C (nolock) 
     on C.Location = W.Location 
     inner join Seller S (nolock) 
     on S.branch=S.branch and S.customerbase=W.customerbase and S.detail='' 
     where not (W.Location = 'USA' or (len(W.Location)=3 and upper(substring(W.Location,3,1))='A')) 
    end 
    else 
    begin 
    insert into W (d, e, f) 
    select (case 
       when creditCard = 'N' then dbo.GetDecimal(W.USD) 
       when creditCard ='Y' then -dbo.GetDecimal(W.USD) end, 
      case 
       when creditCard = 'N' then dbo.GetDecimal(W.EUR) 
       when creditCard ='Y' then -dbo.GetDecimal(W.EUR) end, 
      W.f) 
     from table Wallet W 
     left outer join Country C (nolock) 
     on C.Location = W.Location 
     inner join Seller S (nolock) 
     on S.branch=S.branch and S.customerbase=W.customerbase and S.detail='' 
     where not (W.Location = 'USA' or (len(W.Location)=3 and upper(substring(W.Location,3,1))='A')) 

Могу ли я знать, поставив условие case when снаружи (замените, если еще) будет 1. улучшить производительность запросов и 2. есть другой способ, чтобы оптимизировать этот код?

* dbo.Getdecimal хранимая процедура

+2

Это огромный беспорядок. Укажите фактический код. – Amit

+0

Заявления о случаях без END – Justin

+0

Вам все еще нужно получить более ясный вопрос, см. [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). –

ответ

1

Ваш псевдо-код не очень понятно, но если ваш код действительно делает это ... Тот факт, что вы «select case (...) FROM TABLE A/B» без WHERE пункта может быть причина, почему она медленная, потому что вы выбираете и вставляете столько строк, сколько изначально находятся в таблице A или B, в таблицу A.

Кажется, что ссылка INSERT INTO ... VALUES ... здесь имеет больше смысла, чем SELECT INTO ... SELECT ....

В таком случае, если на месте может быть немного меньше, так как вы могли бы избежать тестирования flag1 = 'N' or 'Y' дважды, но это было бы больше похоже на микро-оптимизацию. Я не уверен, как это повлияет на производительность, но если это действительно важно, я бы испытал оба решения с планом выполнения SQL.

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