[MsSQL] odwolywanie sie do zmiennej i optymalizacja

0

Witam

mam 2 pytania, pierwsze to:

(1)
mam takie zapytanie:
Select (1+2) as Pole from Tabela where Pole = 3
(dziala tylko Select (1+2) as Pole from Tabela where (1+2) = 3)

zapytanie zwraca blad: Invalid column name 'pole'.

w jaki posob po where odwolywac sie do pol obliczeniowych?

drugie pytanie:
(2)

napisalem sobie obliczenie wyciagajace ze stringa w stylu:
abc('200-300') -> 200-300
abcde('345') -> 345

jest to : SUBSTRING(POLE,PATINDEX('%(%',POLE )+2,(PATINDEX('%)%',POLE )-PATINDEX('%(%',POLE )-3))

teraz mam zapytanie:

select SUBSTRING(POLE,PATINDEX('%(%',POLE )+2,(PATINDEX('%)%',POLE )-PATINDEX('%(%',POLE )-3)) as pole1 from tabela1
join tabela2 on pole2 = (SUBSTRING(POLE,PATINDEX('%(%',POLE )+2,(PATINDEX('%)%',POLE )-PATINDEX('%(%',POLE )-3)))

wszystko ok , ale takie obliczenia zarzynaja procka i trwa to wieki :/
bez tych obliczen trwa to chwilke,

Da sie to jakos przyspieszyc? moze inna funkcja?

0

Ad 1: Z tego co wiem, standard SQL nie przewiduje możliwości odwoływania się w sekcji WHERE do pól sekcji SELECT. Być może niektóre systemy to implementują jako rozszerzenie - MySQL widać nie. PostgreSQL też nie.
Po prostu trochę trudno coś takiego zrobić, ponieważ sekcja WHERE jest przetwarzane zwykle przed SELECT. Optymalizator musiałby umieć przepychać projekcję lub jej część (SELECT) w dół drzewa, poniżej operatora filtrowania (WHERE). Oczywiście to się da zrobić i chyba bardziej zaawansowane systemy to mają.

Na razie możesz spróbować to obejść przez: SELECT p FROM (SELECT 1+2 AS p FROM tabela) WHERE p = 3;
i liczyć na to, że optymalizator z automatu skopiuje warunek WHERE do podzapytania (ale w MySQL to akurat wątpię).

Ad 2: Zarzynasz procka bo nie dałeś WHERE i MySQL sprawdza każdy rekord z każdym. MySQL jest dosyć prymitywnym systemem i nie potrafi robić takiego złączenia wydajniej. Myślę, że jak byś przeniósł się przynajmniej na PostgreSQL, to takie zapytanie działałoby kilka-kilkaset razy szybciej, bo Postgres pojechałby sortmerge joinem albo hash joinem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1