Buduję widok. Niestety nie jestem w stanie zagwarantować unikalności wartości w żadnej z kolumn. Chciałbym go zmaterializować, aby przyspieszyć odczyty. Czy jest jakiś sposób, aby to zrobić?
Buduję widok. Niestety nie jestem w stanie zagwarantować unikalności wartości w żadnej z kolumn. Chciałbym go zmaterializować, aby przyspieszyć odczyty. Czy jest jakiś sposób, aby to zrobić?
Rozumiem, że chodzi o zrobienie widoku indeksowanego? Robi się to zakładając indeks "clustered" na widoku. Ale do tego potrzebna jest unikalna kolumna. Ewentualnie może być kilka kolumn, które razem posiadają unikalną wartość. Tak jak klucz główny, tak index można zakładać na kombinacji kolumn.
Dziękuję za odpowiedź.
Czasem jednak trudno znaleźć odpowiednią kombinację kolumn, która zapewniłaby unikalność. Czy wtedy jestem na przegranej pozycji i nie zrobię widoku indeksowanego? Może dałoby się dodać jakąś kolumnę bazującą na rowid, lub coś podobnego, co zapewniłoby unikalność? Mnie nie udało się tego w żaden sposób zrobić.
Dodajesz kolumnę, która posiada właściwość AutoID oraz Auto Increment. Załóżmy, że Twoja kolumna w tabeli nazywa się ID_Key, a za tą kolumną są kolejne np NAME, SURNAME, ADRESS itp.
I teraz po ID_Key odwołujesz się do unikalnego wpisu w tej tabeli.
Dziękuję trols_ps. Tabela nie jest moja, nie mogę jej modyfikować. Mogę operować tylko widokiem.
Próbowałem:
create view xyz.test_mater WITH SCHEMABINDING as select row_number() over (order by AdresMAC) as ID_KEY, net.AdresMAC from xyz.net go create clustered index test_idx on xyz.test_mater (ID_KEY)
Wynik:
Msg 1941, Level 16, State 1, Line 1Cannot create nonunique clustered index on view 'xyz.test_mater' because only unique clustered indexes are allowed. Consider creating unique clustered index instead.
Możesz spróbować pogrupować dane w tym zapytaniu, tak żeby mieć jakiś unikalny zestaw kolumn (od biedy możesz pogrupować po wszystkich kolumnach i klucz założyć na wszystkie kolumny). Tylko pytanie, czy taki widok rzeczywiście przyspieszy zapytanie.
Zobacz poniższy przykład:
create table a(p1 int, p2 int)
insert into a values(1,1)
insert into a values(1,2)
insert into a values(1,1)
go
drop view v
go
create view v with schemabinding
as select p1,p2,count_big(*) cnt from dbo.a
group by p1,p2
create unique clustered index ai on v(p1,p2)