/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MS Sql select - performance
Fra : MKJ


Dato : 22-01-08 12:37

Hej

Jeg har problemer med performance på en søgning.
Systemet der søges i er et arkivsystem der består af X antal sager der hver
kan indeholde X antal emner.
Problemet er ikke selve søgningen men et check der skal laves for at finde
ud af om brugeren har rettigheder til et emne.

Der er 2 forskellige måder en bruger kan få rettigheder til et emne:
1) Der er ikke angivet en adgangsgruppe på selve emnet.
2) Der er angivet en eller flere adgangsgrupper på emnet som brugeren er
medlem af.

Pt. bruger jeg en sql funktion til at finde ud af om brugeren har de
nødvendige rettigheder så nu ligner søgningen noget i retning af:

"SELECT * FROM Documents WHERE Description LIKE '%søgeord%' AND
DBO.func_CanGetItem(Documents.DocumentId, @UserId) = 1"

Rettighederne er angivet i en simpel tabel der bla. indeholder ItemId,
GroupId derudover er der en Users tabel en Groups tabel samt en GroupsUsers
tabel.
Der er ingen tvivl om at det er funktionskaldet der tager lang tid og det
der skal fjernes jeg ved bare ikke hvordan man flytter det samme check til
sin select.

--
MKJ


 
 
Keld Nygaard (22-01-2008)
Kommentar
Fra : Keld Nygaard


Dato : 22-01-08 13:41


"MKJ" <m@ds.dk> skrev i en meddelelse
news:4795d557$0$2086$edfadb0f@dtext02.news.tele.dk...
> Hej
>
> Jeg har problemer med performance på en søgning.
> Systemet der søges i er et arkivsystem der består af X antal sager der
> hver kan indeholde X antal emner.
> Problemet er ikke selve søgningen men et check der skal laves for at finde
> ud af om brugeren har rettigheder til et emne.
>
> Der er 2 forskellige måder en bruger kan få rettigheder til et emne:
> 1) Der er ikke angivet en adgangsgruppe på selve emnet.
> 2) Der er angivet en eller flere adgangsgrupper på emnet som brugeren er
> medlem af.
>
> Pt. bruger jeg en sql funktion til at finde ud af om brugeren har de
> nødvendige rettigheder så nu ligner søgningen noget i retning af:
>
> "SELECT * FROM Documents WHERE Description LIKE '%søgeord%' AND
> DBO.func_CanGetItem(Documents.DocumentId, @UserId) = 1"
>
> Rettighederne er angivet i en simpel tabel der bla. indeholder ItemId,
> GroupId derudover er der en Users tabel en Groups tabel samt en
> GroupsUsers tabel.
> Der er ingen tvivl om at det er funktionskaldet der tager lang tid og det
> der skal fjernes jeg ved bare ikke hvordan man flytter det samme check til
> sin select.
>
> --
> MKJ
>
Hvis vi forestiller os 2 tabeller:
tblEmner
ID Emne
1 Emne 1
2 Emne 2
3 Emne 3

tblRettighed
ID EmneID SikkerhedsID
1 1 24
2 1 18
3 1 2
4 2 24
5 2 18
6 3 2

SikkerhedsID kan være både brugerid og gruppe id!

Du har en bruger der har sikkerhedsID'erne (2, 15, 97) og vil vide om han
har rettighed til EmneID 2

Nu må du ikke holde mig op på syntaxen (specielt på det med IN), men noget i
stil med....

SELECT DISTINCT e.Emne FROM tblEmne as e, tblRettighed as r WHERE e.ID = 2
AND e.ID = r.EmneID AND r.SikkerhedsID IN (2, 15, 97)

--
Mvh
Nygaard
www.nygaard.eu



MKJ (22-01-2008)
Kommentar
Fra : MKJ


Dato : 22-01-08 15:47

"Keld Nygaard" <no@spam.dk> wrote in message
news:4795e45f$0$15899$edfadb0f@dtext01.news.tele.dk...
>
> "MKJ" <m@ds.dk> skrev i en meddelelse
> news:4795d557$0$2086$edfadb0f@dtext02.news.tele.dk...
>> Hej
>>
>> Rettighederne er angivet i en simpel tabel der bla. indeholder ItemId,
>> GroupId derudover er der en Users tabel en Groups tabel samt en
>> GroupsUsers tabel.
>> Der er ingen tvivl om at det er funktionskaldet der tager lang tid og det
>> der skal fjernes jeg ved bare ikke hvordan man flytter det samme check
>> til sin select.
>>
>> --
>> MKJ
>>
> Hvis vi forestiller os 2 tabeller:
> tblEmner
> ID Emne
> 1 Emne 1
> 2 Emne 2
> 3 Emne 3
>
> tblRettighed
> ID EmneID SikkerhedsID
> 1 1 24
> 2 1 18
> 3 1 2
> 4 2 24
> 5 2 18
> 6 3 2
>
> SikkerhedsID kan være både brugerid og gruppe id!
>
> Du har en bruger der har sikkerhedsID'erne (2, 15, 97) og vil vide om han
> har rettighed til EmneID 2
>
> Nu må du ikke holde mig op på syntaxen (specielt på det med IN), men noget
> i stil med....
>
> SELECT DISTINCT e.Emne FROM tblEmne as e, tblRettighed as r WHERE e.ID = 2
> AND e.ID = r.EmneID AND r.SikkerhedsID IN (2, 15, 97)
>
> --
> Mvh
> Nygaard
> www.nygaard.eu
>
>

Hej

IN kræver at alle rettigheder står i rettighedstabellen - ikke sandt? Der er
jo også den mulighed at der ikke er defineret nogle rettigheder på et emne i
så tilfælde skal alle kunne se emnet men det vil ikke virke med IN
funktionen.

--
MKJ


Stig Johansen (23-01-2008)
Kommentar
Fra : Stig Johansen


Dato : 23-01-08 21:45

MKJ wrote:

> Hej
>
> IN kræver at alle rettigheder står i rettighedstabellen - ikke sandt? Der
> er jo også den mulighed at der ikke er defineret nogle rettigheder på et
> emne i så tilfælde skal alle kunne se emnet men det vil ikke virke med IN
> funktionen.

Ingen rettighed = ingen adgang.
Opret en id der betyder adgang for alle, og brug den.

NB SELECT *  er ikke god karma.

--
Med venlig hilsen
Stig Johansen

Gert Krabsen (22-01-2008)
Kommentar
Fra : Gert Krabsen


Dato : 22-01-08 18:05

MKJ skrev:
> Hej
>
> Jeg har problemer med performance på en søgning.
> Systemet der søges i er et arkivsystem der består af X antal sager der
> hver kan indeholde X antal emner.
> Problemet er ikke selve søgningen men et check der skal laves for at
> finde ud af om brugeren har rettigheder til et emne.
>
> Der er 2 forskellige måder en bruger kan få rettigheder til et emne:
> 1) Der er ikke angivet en adgangsgruppe på selve emnet.
> 2) Der er angivet en eller flere adgangsgrupper på emnet som brugeren er
> medlem af.
>
> Pt. bruger jeg en sql funktion til at finde ud af om brugeren har de
> nødvendige rettigheder så nu ligner søgningen noget i retning af:
>
> "SELECT * FROM Documents WHERE Description LIKE '%søgeord%' AND
> DBO.func_CanGetItem(Documents.DocumentId, @UserId) = 1"
>
> Rettighederne er angivet i en simpel tabel der bla. indeholder ItemId,
> GroupId derudover er der en Users tabel en Groups tabel samt en
> GroupsUsers tabel.
> Der er ingen tvivl om at det er funktionskaldet der tager lang tid og
> det der skal fjernes jeg ved bare ikke hvordan man flytter det samme
> check til sin select.

En søgning med LIKE '*xx*' vil altid være tung, hvis det er en stor
tabel, for den skal jo hente samtlige records ind.

Har du i øvrigt sikret dig, at der er oprettet indeks på alle de felter,
der indgår?


mkj (22-01-2008)
Kommentar
Fra : mkj


Dato : 22-01-08 19:37

>> Pt. bruger jeg en sql funktion til at finde ud af om brugeren har de
>> nødvendige rettigheder så nu ligner søgningen noget i retning af:
>>
>> "SELECT * FROM Documents WHERE Description LIKE '%søgeord%' AND
>> DBO.func_CanGetItem(Documents.DocumentId, @UserId) = 1"
>>
>> Rettighederne er angivet i en simpel tabel der bla. indeholder ItemId,
>> GroupId derudover er der en Users tabel en Groups tabel samt en
>> GroupsUsers tabel.
>> Der er ingen tvivl om at det er funktionskaldet der tager lang tid og det
>> der skal fjernes jeg ved bare ikke hvordan man flytter det samme check
>> til sin select.
>
> En søgning med LIKE '*xx*' vil altid være tung, hvis det er en stor tabel,
> for den skal jo hente samtlige records ind.
>
> Har du i øvrigt sikret dig, at der er oprettet indeks på alle de felter,
> der indgår?


Hej

Det er ikke min LIKE der tager tid det er rettighedschecket der tager lang
tid.

--
MKJ


Peter Lykkegaard (22-01-2008)
Kommentar
Fra : Peter Lykkegaard


Dato : 22-01-08 20:59

"MKJ" wrote
>
> "SELECT * FROM Documents WHERE Description LIKE '%søgeord%' AND
> DBO.func_CanGetItem(Documents.DocumentId, @UserId) = 1"
>
Hmm et skud i tågen?

SELECT *
FROM (
SELECT *
FROM Documents
WHERE Description LIKE '%søgeord%'
) AS Docs
WHERE DBO.func_CanGetItem(Docs.DocumentId, @UserId) = 1

?

- Peter


Jesper (23-01-2008)
Kommentar
Fra : Jesper


Dato : 23-01-08 20:53

Hvad er koden til funktionen?

Jesper.



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste