Temat: [Oracle] Czyszczenie kilku danych tekstowych jednocześnie...

Witam,
w tabeli z klientami mam ok 10 pól w których dane muszę "oczyścić" funkcja TRIM.

Robię to w ten sposób:

UPDATE cct_clients cli SET cli.CLI_LAST_NAME=(select trimCLI_LAST_NAME) from cct_clients cli2 where cli.cli_id = cli2.cli_id) where cli.CLI_LAST_NAME like cli.CLI_LAST_NAME like ' %' or cli.CLI_LAST_NAME like '% ';
commit;
UPDATE cct_clients cli SET cli.CLI_First_NAME=(select trimCLI_LAST_NAME) from cct_clients cli2 where cli.cli_id = cli2.cli_id) where cli.CLI_first_NAME like cli.CLI_first_NAME like ' %' or cli.CLI_first_NAME like '% ';
commit;
UPDATE cct_clients cli SET cli.pole3=(select trimCLI_LAST_NAME) from cct_clients cli2 where cli.cli_id = cli2.cli_id) where cli.pole3 like cli.pole3 like ' %' or cli.pole3 like '% ';
commit;
...


Mam kilka pytań:

1. Czy można zrobić to w ten sposób, żeby nie było potrzebne tyle przebiegów po całej tabeli ile pól mam zamiar czyścić? Inaczej, czy w jednym przebiegu można update-ować więcej niż jedno pole?
Zamiast polami szło by wierszami, po kolei wiersz po wierszu sprawdzane byłby wszystkie pola na obecność spacji.
2. Czy konieczny jest warunek pole3 like pole3 like ' %' or pole3 like '% ', czy bez niego zostałyby nadpisane wszystkie wartości w kolumnie (polu) bez względu czy się zmieniły czy nie?
(Nie chce eksperymentować na jej całej długości)
3. Czy dodawanie warunku pole3 like pole3 like ' %' or pole3 like '% ' nie ogranicza tego co mogłaby dać funkcja Trim, mam na myśli czy funkcja Trim mogłaby wyczyścić coś ponad spacje?

konto usunięte

Temat: [Oracle] Czyszczenie kilku danych tekstowych jednocześnie...


update tabela set pole1 = trim(pole1), pole2 = trim(pole2), pole3 = trim(pole3) ... polex = trim(polex)

Nie wiem ile danych chcesz updatować ale ten where może być bardziej kosztowny niż przelecenie wszystkiego. Jak jest to duża tabela (miliony rekordów) to można zrobić create table as select - będzie wydajniejsze.
Jeśli jest to jednorazowa akcja to zrób updata. Jak masz taki problem systematycznie to zapnij trima na trigerze.Ten post został edytowany przez Autora dnia 22.05.13 o godzinie 21:22

Temat: [Oracle] Czyszczenie kilku danych tekstowych jednocześnie...

Moja propozycja:

UPDATE schemat.cct_clients c
SET
c.CLI_LAST_NAME=TRIM(c.CLI_LAST_NAME),
c.CLI_First_NAME=TRIM(c.CLI_First_NAME),
...
WHERE c.CLI_LAST_NAM LIKE ' %' OR c.CLI_LAST_NAM LIKE '% '
OR c.CLI_First_NAME LIKE ' %' OR c.CLI_First_NAME LIKE '% '
...


1. Tak, można updatować wiele kolumn za jednym przebiegiem
2. Warto dodawać warunek na istnienie spacji, bo to przyspieszy wykonania zapytania.
3. Wywołanie funkcji TRIM bez parametrów usuwa tylko spacje na początku i końcu ciągu znaków.
4. Zapytania powinny być możliwie proste w logice, bo ważniejsze od wydajności jest nie popełnienie błędu.

Kilka uwag praktycznych, które mają zastosowanie do dużych tabel:
1. Warto jest robić update na całym rekordzie, jeśli chociaż jedna kolumna wymaga obcięcia spacji, bo wydajnościowo w zasadzie nie ma różnicy czy updatowane są 3 kolumny, czy tylko 1 - w takim przypadku operacje dyskowe są najcięższe.
2. UPDATE jest operacją baaaaardzo powolną w takiej podstawowej składni, szczególnie jeśli znaczny procent danych tabeli ma być zmieniony. Jeśli ma to być regularnie uruchamiane, to może na etapie wprowadzania danych da się wyeliminować te spacje.
3. Jeśli tabela jest ogromna i UPDATE'u nie da się uniknąć, to warto żeby się tym konkretnym danym przyjrzał ktoś z doświadczeniem w tej dziedzinie.

konto usunięte

Temat: [Oracle] Czyszczenie kilku danych tekstowych jednocześnie...

Piotr C.:
Moja propozycja:

UPDATE schemat.cct_clients c
SET
c.CLI_LAST_NAME=TRIM(c.CLI_LAST_NAME),
c.CLI_First_NAME=TRIM(c.CLI_First_NAME),
...
WHERE c.CLI_LAST_NAM LIKE ' %' OR c.CLI_LAST_NAM LIKE '% '
OR c.CLI_First_NAME LIKE ' %' OR c.CLI_First_NAME LIKE '% '
...

4. Zapytania powinny być możliwie proste w logice, bo ważniejsze od wydajności jest nie popełnienie błędu.

jeśli w last_name masz spację to niepotrzebnie updatujesz first_name etc.

imho właśnie dlatego lepiej to zrobić kilkoma zapytaniami, albo jak Tomek pisze bez warunków, albo triggerem, albo po stronie aplikacji.
Aneta R.

Aneta R. BI Consultant, Atos

Temat: [Oracle] Czyszczenie kilku danych tekstowych jednocześnie...

Można też chyba:
SET
c.CLI_LAST_NAME=TRIM(c.CLI_LAST_NAME),
WHERE
c.CLI_LAST_NAM LIKE <> trim(c.CLI_LAST_NAM LIKE)

Też uważam, że lepiej o to zadbać na etapie Insertu.

Temat: [Oracle] Czyszczenie kilku danych tekstowych jednocześnie...

Wojciech M.:
Piotr C.:
Moja propozycja:

UPDATE schemat.cct_clients c
SET
c.CLI_LAST_NAME=TRIM(c.CLI_LAST_NAME),
c.CLI_First_NAME=TRIM(c.CLI_First_NAME),
...
WHERE c.CLI_LAST_NAM LIKE ' %' OR c.CLI_LAST_NAM LIKE '% '
OR c.CLI_First_NAME LIKE ' %' OR c.CLI_First_NAME LIKE '% '
...


4. Zapytania powinny być możliwie proste w logice, bo ważniejsze od wydajności jest nie popełnienie błędu.

jeśli w last_name masz spację to niepotrzebnie updatujesz first_name etc.

imho właśnie dlatego lepiej to zrobić kilkoma zapytaniami, albo jak Tomek pisze bez warunków, albo triggerem, albo po stronie aplikacji.


Podaje przykład, który mówi sam za siebie.

Mam wygenerowaną tabelę zawierającą 2mln rekordów. Kilka kolumn tekstowych zawiera różne ilości danych ze spacjami na początku/końcu.

Podsumowanie:
1. Puszczenie jednego zapytania na wszystkich kolumnach zamiast oddzielnych do każdej kolumny, to prawie 3 krotnie krótszy czas wykonania, mniej bloków danych przeczytanych i dwukrotnie mniej wygenerowanych redo logów.
2. Wykonanie update na tabeli gdzie do jednej kolumny celowo dodaje spacje. Update mawet na kolumnach, które tego nie wymagają (2 dodatkowych), to prawie brak różnicy w czasie wykonania zapytania, niemal identyczna ilość bloków przeczytanych i tylko nieco większa ilość wygenerowanych redo logów (o kilkanaście procent).

Kod wrzucam w plikach zewnętrznych, żeby zachować formatowanie.
http://cho.pl/update_wielokrotny_vs_jednokrotny.txt
http://cho.pl/update_1_kolumny_vs_3_kolumn.txt

konto usunięte

Temat: [Oracle] Czyszczenie kilku danych tekstowych jednocześnie...

No, zgoda, wydajnościowo jest lepiej odnosiłem się raczej do tego, ż ten OR w warunkach stanowi jakąś tam pułapkę, więc prościej to puścić 3 razy albo dla wszystkiego. Chociaż wiadomo, że to akurat subiektywne
Adam H.

Adam H. Analityk Integracji
Systemów/Analityk
Systemowy

Temat: [Oracle] Czyszczenie kilku danych tekstowych jednocześnie...

Mozna, tak jak juz wczesniej napisali koledzy, nie bede podawal nowych przykladow, bo te zostaly wyczerpane. Jezeli jednak masz duzo tych klientow (nie wiem jaki jest wolumen) to wszystkich mozesz zalatwic tworzac kursor i potem update w petli for (albo while jezeli ktos preferuje), daj znac jezeli cos takiego Ci sie przyda, to moge podpowiedziec albo napisac w PL/SQLu.

Następna dyskusja:

[Oracle] Czyszczenie danych...




Wyślij zaproszenie do