Wpis z mikrobloga

Ok mam problem wydajnościowy w funkcji. Mam przypadkowo takie zapytanie:

SELECT
Numer,
(SELECT TOP 1 Wartosc FROM Tabela_B WHERE Tabela_B.Numer = Tabela_A.Numer ORDER BY ID DESC)
FROM Tabela_A

Czyli pobieram TOP 1 jakaś wartość z TabelaB wedle numeru z TabelaA, ale działa to wolno.
Jak to przyspieszyć?

#sql #mssql #programowanie #bazydanych
  • 14
tabelaA zwraca mi z 800 rekordów ale w tabeliB mam prawie 10 milionów i to łączenie masakruje mi czas wykonania zapytania
@n1troo:
SELECT TOP 1 zmienić na joina do tabeli B i sprawdzić jak działa
Na przykład.

SELECT
a.Numer,
b.Wartosc
FROM Tabela_A
LEFT JOIN (
SELECT
b.Numer,
b.Wartosc
FROM Tabela_B b
INNER JOIN (
SELECT
MAX(ID) AS id
FROM Tabela_B
GROUP BY Numer) bb
ON bb.ID = b.ID
) b
ON b.Numer = a.Numer

Many Transact-SQL statements that include subqueries can be alternatively formulated as joins. Other questions can be posed only
@n1troo:
coś takiego może?

SELECT A.Numer, X.Wartosc FROM TabelaA A
OUTER APPLY
(
SELECT TOP 1 Wartosc FROM Tabela
B WHERE Tabela_B.Numer = A.Numer ORDER BY ID DESC
) X

nie wiem czy to cos usprawni
@n1troo: ale co nie dziala i co to znaczy gorzej? idea tego indeksu jest wlasnie pozbycie sie index scan na tej duzej tabeli... to trzeba porownac plany zapytan przed i po (include actual execution plan kliknac) + wyczyscic cache przed kazdym odpaleniem.
via Wykop Mobilny (Android)
  • 0
@n1troo: no chyba za dużo nie zrobisz bo to correlated subquery czyli wykonujesz przeszukanie B dla każdego wiersza A, co zresztą widać jako pętla na planie wykonania.
Coś się zmieniło w planie po dodaniu indeksu co @DarkAlchemy i @nowy1333123123 podawali?
Wartosc to jakas kolumna czy wyrażenie liczone z czegoś?