percentyl według COUNT (DISTINCT) ze skorelowanym WHERE działa tylko z widokiem (lub bez DISTINCT)
Mam dziwną i nie wiem, czy to moja składnia (która wydaje się prosta), czy błąd (lub po prostu nieobsługiwany).
Oto moje zapytanie, które działa, ale jest niepotrzebnie powolne:
UPDATE table1
SET table1column1 =
(SELECT COUNT(DISTINCT table2column1) FROM table2view WHERE table2column1 <= (SELECT table2column1 FROM table2 WHERE table2.id = table1.id) )
/
(SELECT COUNT(DISTINCT table2column1) FROM table2)
+ (SELECT COUNT(DISTINCT table2column2) FROM table2view WHERE table2column2 <= (SELECT table2column2 FROM table2 WHERE table2.id = table1.id) )
/
(SELECT COUNT(DISTINCT table2column2) FROM table2)
+ (SELECT COUNT(DISTINCT table2column3) FROM table2view WHERE table2column3 <= (SELECT table2column3 FROM table2 WHERE table2.id = table1.id) )
/ (SELECT COUNT(DISTINCT table2column3) FROM table2);
Jest to tylko suma trzech percentyli (z table2column1, table2column2 i table2column3) z usuniętymi duplikatami.
Oto, gdzie robi się dziwnie. Muszę użyć widoku, aby pracować z podzapytaniem za pomocąWHERE
lub będzie tylkoUPDATE
pierwszy rządtable1
i ustaw resztę rzędów ”table1column1
do0
. Żetable2view
jest dokładnym duplikatemtable2
. Tak, dziwne.
Jeśli nie użyjęDISTINCT
, Mogę to zrobić bez widoku. Czy to ma sens?Uwaga: musze miećDISTINCT
ponieważ mam dużo duplikatów.
Próbowałem to zrobićSELECT
tylko z widoku, ale to go spowolniło.
Czy ktoś wie, jaki jest problem i jak najlepiej przerobić to zapytanie, aby nie trwało to tak długo? Jest wTRIGGER
, a zaktualizowane dane są dość na żądanie.
Z góry bardzo dziękuję!
Detale
Testuję szybkość w linii poleceń phpMyAdmina.
Jestem pewien, że degradacja pochodzi z widoku, ponieważ im więcej widoku i mniej rzeczywistego stołu używam, tym wolniej się robi.
Kiedy robię to bezDISTINCT
, to błyskawicznie.
Działa tylko na widokach?
OK, więc po prostu skonfigurowałem kopiętable2
. Próbowałem najpierw wykonać oryginalne zapytanie zastępujące widok kopią. Nie idź.
Próbowałem wykonać zapytanie poniżej z kopią zamiast z widokiem. Nie idź.
Mam nadzieję, że wprowadzenie tych stałych lepiej pokaże, co próbuję zrobić.
SET @table2column1_distinct_count = (SELECT COUNT(DISTINCT table2column1) FROM table2);
SET @table2column2_distinct_count = (SELECT COUNT(DISTINCT table2column2) FROM table2);
SET @table2column3_distinct_count = (SELECT COUNT(DISTINCT table2column3) FROM table2);
UPDATE table1, table2
SET table1.table1column1 = (SELECT COUNT(DISTINCT table2column1) FROM table2view WHERE table2column1 <= table2.table2column1) / @table2column1_distinct_count
+ (SELECT COUNT(DISTINCT table2column2) FROM table2view WHERE table2column2 <= table2.table2column2) / @table2column2_distinct_count
+ (SELECT COUNT(DISTINCT table2column3) FROM table2view WHERE table2column3 <= table2.table2column3) / @table2column3_distinct_count
WHERE table1.id = table2.id;
Znowu, kiedy używamtable2
zamiast tegotable2view
, aktualizuje tylko pierwszy wiersz poprawnie i ustawia wszystkie inne wiersze 'table1.table1column1 =0
.
Matematyka
Próbuję to ustawićtable1.table1column1
= do sumy percentylitable2column1
, table2column2
, itable2column3
przezid
.
Robię percentyl przez (licząc różne wartości atable2columnX
<= do prądutable2columnX
) / (całkowita liczba odrębnychtable2columnX
s).
używamDISTINCT
pozbyć się nadmiernych duplikatów.
Widok
Tutaj jestSELECT
dla widoku. czy to pomaga?
CREATE VIEW myTable.table2view AS SELECT
table2.table2column1 AS table2column1,
table2.table2column2 AS table2column2,
table2.table2column2 AS table2column3,
FROM table2
GROUP BY table2.id;
Czy jest coś specjalnego w tymGROUP BY
w widokuSELECT
to sprawia, że ta praca (której nie widzę)?