cancel
Showing results for 
Search instead for 
Did you mean: 
Subscribe

Hi folks,

We have an SQL type calculation view that is performing badly.  Upon analyzing the visual plan we have found the root of the problem due to a case statement that is simply evaluating two tables and if a field is null in one table then choose the other alternate table field;  something like this;

select

case when a.Customer IS NULL THEN

b.Customer

else

a.Customer

End

As TheCustomer

from table1 a join table2 b on a.XYZ = b.XYZ

etc

If we take the case statement away and simply return both values, the query runs very fast around 2 seconds.  ie: something like this;

select

a.Customer as Customer1,

b.Customer as Customer2

from table1 a join table2 b on a.XYZ = b.XYZ

etc

But doing the case evaluation between the two field values bumps the execution time up to more than 60 seconds!

Has anybody experienced this and do you have any alternative suggestions to achieve this sort of thing?  We have also tried doing a second pass and putting the case evaluation OUTSIDE the original select statement and there is some big improvement yet still not satisfactory.  ie: something like this;

select

case when a.Customer IS NULL THEN

b.Customer

else

a.Customer

End

As TheCustomer from

( select

a.Customer as Customer1,

b.Customer as Customer2

from table1 a join table2 b on a.XYZ = b.XYZ

etc)

Thanks,

-Patrick

0 Likes
View Entire Topic
lbreddemann
Active Contributor
0 Likes

Just to mention it: very good way to put the question!

If everybody would do it like this, providing answers would be a whole lot easier.

In case you want to improve this even further, please provide a working example next time.

Something like this:

create column table customers (id integer, name varchar(30))

insert into customers values (1, 'BLA');

insert into customers values (2, NULL);

insert into customers values (3, 'BLUPP');

insert into customers values (4, NULL);

insert into customers values (5, 'BLIP');

insert into customers values (6, 'BLOP');

select c1.id, c1.name as c1name, c2.name as c2name, coalesce (c1.name, c2.name)

from

    customers c1 inner join customers c2

                 on c1.id = c2.id+1

order by c1.id                

is already sufficient to work with your issue.

- Lars