2010-10-14 16 views
6

Niektóre artykuły znalezione w Internecie porównywały ISNULL z COALESCE, więc myślę, że moje pytanie jest trochę inne.COALESCE vs IS NOT NULL wydajność przy sprawdzaniu pustego ciągu znaków

Zastanawiam się, który jest lepszy pod względem wydajności?

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> ''; 

Albo

SELECT * FROM mytable WHERE COALESCE(mycolumn,'') <> ''; 

Inne niż wydajność, czy są jakieś inne kwestie należy wziąć pod uwagę przy podejmowaniu decyzji?

EDIT:

Używam Teradata.

Odpowiedz

7

Ta wersja jest nieco bardziej sargable i pozwala indeks być (potencjalnie) stosowany

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> ''; 

To może być uproszczone do

SELECT * FROM mytable WHERE mycolumn <> ''; 

powód, dla którego mówię "lekko" i „potencjalnie "jest to, że orzeczenie o braku równości może w każdym razie oznaczać, że skończysz z pełnym skanowaniem.

+0

Jako kolejne pytanie, jeśli wiedzieliśmy, że indeks zostanie użyty, możemy być w stanie automatycznie zoptymalizować sql (za kulisami) i przetłumaczyć COALESCE (mykolumn, '') <> '' na mykolumę NIE JEST NULL i mykolumn <> ''. Czy mam sens? – Russell

+0

Wierzę, że może się okazać, że NUSI nie może być użyte do zaspokojenia nierówności. Warto sprawdzić EXPLAIN, aby sprawdzić, czy optymalizator używa NUSI. –

1

Możesz także rozważyć użycie ANSI_NULL ON setting. Spowoduje to niejawne odfiltrowanie wartości null w kolumnie, w której zostanie wywołany argument wyszukiwania. Wykonanie tego upraszcza zapytanie, nie jestem pewien, czy przyspieszy to. Logicznie w teorii powinno jednak, ponieważ mniej argumentów filtrów należy poddać ocenie i nie są używane żadne funkcje w klauzuli where, która powinna umożliwiać pełną selektywność indeksu. Jako przykład możesz ponownie rozważyć zapytanie w następujący sposób:

SET ANSI_NULLS ON; 
SELECT * FROM mytable WHERE NOT mycolumn = ''; 

Mam nadzieję, że to pomoże.