[mssql] dynamiczna nazwa tabeli
Art - 24-12-2006 00:37
[mssql] dynamiczna nazwa tabeli
Witam.. W bazie mam tabele zawierające jakieś zdarzenia z każdego dnia - każdy dzień jedna tabela.. chciałbym sobie zrobić zapytanie które byłoby w stylu select * from dzisiaj itd..
Teraz radzę sobie w ten sposób:
declare @sql nvarchar(3000) set @sql = N'' set @sql = @sql + N' SELECT * from FROM historia_' set @sql = @sql + substring(convert(varchar,getdate(),120), 1, 4) set @sql = @sql + N'_' set @sql = @sql + substring(convert(varchar,getdate(),120), 6, 2) set @sql = @sql + N'_' set @sql = @sql + substring(convert(varchar,getdate(),120), 9, 2) exec sp_executesql @sql
to działa jednak jak warunków po where trochę wchodzi to jest to niewygodne.. i pytanie:
Czy da się zrobić jakiś view czy coś innego żeby zapytanie tak żeby zamiast formy drugiej dało się zastosować formę pierwszą.. Pozdrawiam Artur Starz
sg - 24-12-2006 00:37
Art napisał(a): > Witam.. > W bazie mam tabele zawierające jakieś zdarzenia z każdego dnia - każdy dzień > jedna tabela.. > chciałbym sobie zrobić zapytanie które byłoby w stylu > select * from dzisiaj itd.. > > Teraz radzę sobie w ten sposób: > > declare @sql nvarchar(3000) > set @sql = N'' > set @sql = @sql + N' SELECT * from FROM historia_' > set @sql = @sql + substring(convert(varchar,getdate(),120), 1, 4) > set @sql = @sql + N'_' > set @sql = @sql + substring(convert(varchar,getdate(),120), 6, 2) > set @sql = @sql + N'_' > set @sql = @sql + substring(convert(varchar,getdate(),120), 9, 2) > exec sp_executesql @sql > > > to działa jednak jak warunków po where trochę wchodzi to jest to > niewygodne.. > i pytanie: > > Czy da się zrobić jakiś view czy coś innego żeby zapytanie tak żeby zamiast > formy drugiej dało się zastosować formę pierwszą.. > Pozdrawiam > Artur Starz > >
oczywiście, trzymaj wszystkie informacje w jednej tabeli
-- Na wszystko skutecznie pomaga woda. Dwie, trzy krople na szklankę wódki
Art - 24-12-2006 00:37
>> W bazie mam tabele zawierające jakieś zdarzenia z każdego dnia - >> każdy dzień jedna tabela.. >> chciałbym sobie zrobić zapytanie które byłoby w stylu >> select * from dzisiaj itd.. >> >> Teraz radzę sobie w ten sposób: >> >> declare @sql nvarchar(3000) >> set @sql = N'' >> set @sql = @sql + N' SELECT * from FROM historia_' >> set @sql = @sql + substring(convert(varchar,getdate(),120), 1, 4) >> set @sql = @sql + N'_' >> set @sql = @sql + substring(convert(varchar,getdate(),120), 6, 2) >> set @sql = @sql + N'_' >> set @sql = @sql + substring(convert(varchar,getdate(),120), 9, 2) >> exec sp_executesql @sql >> >> >> to działa jednak jak warunków po where trochę wchodzi to jest to >> niewygodne.. >> i pytanie: >> >> Czy da się zrobić jakiś view czy coś innego żeby zapytanie tak żeby >> zamiast formy drugiej dało się zastosować formę pierwszą.. >> Pozdrawiam >> Artur Starz >> >> > > oczywiście, trzymaj wszystkie informacje w jednej tabeli
Jakbym tak mógł to by nie było problemu ale: 1. Nie ja jestem autorem głównej aplikacji dopisującej dane, ja korzystam z danych 2. Szybkość przeszukiania bardzo by spadła - danych jest około 90-100 tysięcy dziennie, rocznie to ponad 20 mln rekordów a baza z 2 lat zajmuje kilkadziesiąt Gb więc ze względu na zasoby sprzętowe serwera (pamięć) łatwiej korzystać z większej ilości tabel -korzystanie z danych wcześniejszych jest dużo żadsze niż z ostatniego powiedzmy dnia, 3 dni i tygdnia, maksymalnie miesiąc a potem sporadycznie. więc nie bardzo mogę zastosować się do Twojej rady - czy Ktoś ma jeszcze jakieś pomysły?
Pozdr Artur
sg - 24-12-2006 00:37
Art napisał(a): >>> W bazie mam tabele zawierające jakieś zdarzenia z każdego dnia - >>> każdy dzień jedna tabela.. >>> chciałbym sobie zrobić zapytanie które byłoby w stylu >>> select * from dzisiaj itd.. >>> >>> Teraz radzę sobie w ten sposób: >>> >>> declare @sql nvarchar(3000) >>> set @sql = N'' >>> set @sql = @sql + N' SELECT * from FROM historia_' >>> set @sql = @sql + substring(convert(varchar,getdate(),120), 1, 4) >>> set @sql = @sql + N'_' >>> set @sql = @sql + substring(convert(varchar,getdate(),120), 6, 2) >>> set @sql = @sql + N'_' >>> set @sql = @sql + substring(convert(varchar,getdate(),120), 9, 2) >>> exec sp_executesql @sql >>> >>> >>> to działa jednak jak warunków po where trochę wchodzi to jest to >>> niewygodne.. >>> i pytanie: >>> >>> Czy da się zrobić jakiś view czy coś innego żeby zapytanie tak żeby >>> zamiast formy drugiej dało się zastosować formę pierwszą.. >>> Pozdrawiam >>> Artur Starz >>> >>> >> oczywiście, trzymaj wszystkie informacje w jednej tabeli > > Jakbym tak mógł to by nie było problemu ale: > 1. Nie ja jestem autorem głównej aplikacji dopisującej dane, ja korzystam z > danych
to niewiele poradzisz
> 2. Szybkość przeszukiania bardzo by spadła - danych jest około 90-100 > tysięcy dziennie, rocznie to ponad 20 mln rekordów a baza z 2 lat zajmuje > kilkadziesiąt Gb więc ze względu na zasoby sprzętowe serwera (pamięć) > łatwiej korzystać z większej ilości tabel -korzystanie z danych > wcześniejszych jest dużo żadsze niż z ostatniego powiedzmy dnia, 3 dni i > tygdnia, maksymalnie miesiąc a potem sporadycznie. > więc nie bardzo mogę zastosować się do Twojej rady - czy Ktośma jeszcze > jakieś pomysły? > > Pozdr > Artur > >
nie, szybkość wcale nie musi spaść, wystarczy zrobić odpowiednie indeksy
-- Na wszystko skutecznie pomaga woda. Dwie, trzy krople na szklankę wódki
Art - 24-12-2006 00:37
[ciach]
> to niewiele poradzisz
tego się właśnie obawiałem :-( > >> 2. Szybkość przeszukiania bardzo by spadła - danych jest około 90-100 >> tysięcy dziennie, rocznie to ponad 20 mln rekordów a baza z 2 lat >> zajmuje kilkadziesiąt Gb więc ze względu na zasoby sprzętowe serwera >> (pamięć) łatwiej korzystać z większej ilości tabel -korzystanie z >> danych wcześniejszych jest dużo żadsze niż z ostatniego powiedzmy >> dnia, 3 dni i tygdnia, maksymalnie miesiąc a potem sporadycznie. >> więc nie bardzo mogę zastosować się do Twojej rady - czy Ktoś ma >> jeszcze jakieś pomysły? >> >> Pozdr >> Artur >> >> > > nie, szybkość wcale nie musi spaść, wystarczy zrobić odpowiednie > indeksy
Może i tak, ale e względu na p.1 (nie ja jestem autorem głównego programu) odpada
Pozdrawiam Artur
Marcin A. Guzowski - 24-12-2006 00:37
Art napisał(a): > Czy da się zrobić jakiś view czy coś innego żeby zapytanie tak żeby zamiast > formy drugiej dało się zastosować formę pierwszą..
Od dynamicznego sqla nie uciekniesz.
Można oczywiście kombinować i np. stworzyć sobie widok 'dzisiaj', którego definicja będzie przez ALTER zmieniana każdego dnia przez fragment dynamicznego sqla w jobie. Przy założeniu, że job się wykonał: SELECT * FROM dzisiaj zawsze zwróci dane z aktualnej tabeli.
Tak czy inaczej jest to rzeźba. Prawo propagacji rzeźby mówi, że jedna rzeźba (u Ciebie kwestia tworzenia oddzielnych tabel dla każdego dnia) szybko generuje potrzebę tworzenia nowej rzeźby, aby osiągnąć standardową funkcjonalność (spójny odczyt danych).
Poziome partycjonowanie tabel jest co prawda jednym ze środków optymalizacyjnych, jednak nie osiąga się tego w taki sposób.
-- Pozdrawiam, Marcin Guzowski http://guzowski.info
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Zdalny =?ISO-8859-2?Q?dost=EAp_do_MSSQL_bez_zarz=B1dzani?==?ISO-8859-2?Q?a?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
[MSSQL 2k] - jak =?ISO-8859-2?Q?pod=B3=B1czy=E6_serwer_na_?==?ISO-8859-2?Q?porcie_innym_ni=BF_1433=3F?=
MSSQL Express czy Oracle Express
MSSQL 2005 i uruchamianie procedury o =?ISO-8859-2?Q?okre=B6lone?==?ISO-8859-2?Q?j_godzinie?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
[MSSQL 2000] =?ISO-8859-2?Q?wywo=B3anie_procesu_z_poziomu_?==?ISO-8859-2?Q?job=27a?=
[MSSQL 2K] =?ISO-8859-2?Q?Wp=B3yw_ustawie=F1_regionalnych_?==?ISO-8859-2?Q?serwera_na_zapytania?=
Pobierananie danych z innej bazy danych w MSSQL
Migracja MSSQL 2005 CTP na 2005 Express
zanotowane.pldoc.pisz.plpdf.pisz.plwawa19wwa91.pev.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|