Algoritmus - doplnění hodnot   zodpovězená otázka

SQL, Databáze

Dobrý den,

potřeboval bych poradit s tím, zda je možné vyřešit jeden problém. Nepotřebuji ani tak konkrétní kód, jako spíš vědět od čeho se "odpíchnout," jak na to. V tabulce je sloupec, který je datového typu numeric a má 24 míst, v tabulce je několik milonů řádků, takže to zabírá spoustu místa, navíc takovýchto tabulek je v databázi víc.

Protože tato data slouží jak podklad pro jeden program a nikdy se nebudou měnit, napadlo mě, udělat nový sloupec těch cca 5 milionů 24místných hodnot očíslovat od 1 do 5 000 000, původní sloupec smazat a uštřit tak místo (v každé tabulce). Sloupec slouží pouze pro porovnávání <,>,= atp, takže to takto bude stačit. Problém je (jak jinak), že nevím na to. Poradil by mi prosím někdo jak na to? Udělat nějakou proceduru s kurzorem nebo načíst data do jiné tabulky a tam je nějakým třídícím algoritmem očíslovat a dát zpět?

Díky za případné rady

nahlásit spamnahlásit spam 0 odpovědětodpovědět

mělo by snad stačit toto (za předpokladu že je to jen na tu jednu tabulku a nejsou vazby na jiné)

alter table tabulka add sloupec int identity (1, 1) not null

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vždy vytvořte nový sloupec, ten očíslujte a upravte ho na primarní clustered index. Takto to udělejte se všemi tabulkami a referencemi. Nakonec původní sloupce (až nebudou součástí indexů a referencí) odmažte. Bohužel celý proces není úplně jednoduchý.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky za odpověď! Jen si nejsem jistý, co myslíte tím "ten očíslujete" Data v tabulce nejsou seřezená....

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Můžete je seřadit podle aktuálního klíče a očíslovat (podle primárního klíče jsou stejně data již seřazena v paměti).

Číslování podle nějakého řazení je popsáno tady (používá se tzv. ranking funkce ROW_NUMBER):

http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Prostuduji, díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě mě napdal tento postup:

1) udělat stejnou tabulku s jiným jménem

2) příkazem insert ... select tam vložit stejná data, ale seřazená díky ORDER BY

3) a mít tam navíc právě sloupec s IDENTITY a tím je očíslovat

4) přidat sloupec navíc do původní tabulky a vymazat z ní původní data

5) vložit zpět tyto očíslovaná data

Je to použitelný postup, nebo mě tam něco překvapí?

Díky za odpověď

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Záleží, zda máte reference v jiných tabulkách a kolik těch dat je. Pokud reference existují na tuto tabulku, smazání a vůbec aktuálního klíče nepůjde bez zásahu do jiných tabulek. Pokud reference nejsou, je to v pohodě. Co se týká množství dat, tady je potřeba se zamyslet, jak dlouho potrvá vykopírování všech dat do jiné tabulky. Uvažoval bych i o sekvenčním kopírování (kopírovat například po 1000 řádcích). Na druhou stranu, pokud je dat méně, nemusíte to řešit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Super. Díky :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback