/ 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
Langsom fritekstsøgning i MS SQL
Fra : news.tele.dk


Dato : 19-05-09 14:40

Hej

Jeg har en ms sql 2000 database med en Documents table der indeholder ca
100000 records og en DocumentStatus tabel der indeholder 7 records. Med
nedenstående query kan jeg gennemsøge mit fritekstkatalog, finde de ca. 500
hits på 0.01 sek. Hvis jeg tilføjer "OR CONTAINS(DocumentStatus.*,
'"*kontor*"')" til denne query, tager det pludselig ca. 30 sek. at
gennemsøge fritekstkataloget. Hvad skyldes det dog?



SELECT DocumentId, Description, DocumentStatus.[Name] FROM Documents
INNER JOIN DocumentStatus ON Documents.StatusId = DocumentStatus.StatusId
WHERE CONTAINS(Documents.*, '"*kontor*"')

--
MKJ


 
 
Gert Krabsen (19-05-2009)
Kommentar
Fra : Gert Krabsen


Dato : 19-05-09 17:10

news.tele.dk skrev:
> Hej
>
> Jeg har en ms sql 2000 database med en Documents table der indeholder ca
> 100000 records og en DocumentStatus tabel der indeholder 7 records. Med
> nedenstående query kan jeg gennemsøge mit fritekstkatalog, finde de ca.
> 500 hits på 0.01 sek. Hvis jeg tilføjer "OR CONTAINS(DocumentStatus.*,
> '"*kontor*"')" til denne query, tager det pludselig ca. 30 sek. at
> gennemsøge fritekstkataloget. Hvad skyldes det dog?
>
>
>
> SELECT DocumentId, Description, DocumentStatus.[Name] FROM Documents
> INNER JOIN DocumentStatus ON Documents.StatusId = DocumentStatus.StatusId
> WHERE CONTAINS(Documents.*, '"*kontor*"')
>
> --
> MKJ
>

Hvordan ser den 'hurtige' søgning ud?
Vi er nødt til at kunne se de to alternativer for at se forskellen

news.tele.dk (20-05-2009)
Kommentar
Fra : news.tele.dk


Dato : 20-05-09 13:23

Den hurtige søgning er den jeg har skrevet (0 sek):

SELECT DocumentId, Description, DocumentStatus.[Name] FROM Documents
INNER JOIN DocumentStatus ON Documents.StatusId = DocumentStatus.StatusId
WHERE CONTAINS(Documents.*, '"*kontor*"')

Den langsomme er den samme med et OR fra DocumentStatus tabellen (30 sek):

SELECT DocumentId, Description, DocumentStatus.[Name] FROM Documents
INNER JOIN DocumentStatus ON Documents.StatusId = DocumentStatus.StatusId
WHERE CONTAINS(Documents.*, '"*kontor*"') OR CONTAINS(DocumentStatus.*,
>> '"*kontor*"')

Beklager den kryptiske forklaring.

--
MKJ

"Gert Krabsen" <fjernkrabsen@fjernkrabsenfjern.dk> wrote in message
news:4a12d92a$0$90269$14726298@news.sunsite.dk...
> news.tele.dk skrev:
>> Hej
>>
>> Jeg har en ms sql 2000 database med en Documents table der indeholder ca
>> 100000 records og en DocumentStatus tabel der indeholder 7 records. Med
>> nedenstående query kan jeg gennemsøge mit fritekstkatalog, finde de ca.
>> 500 hits på 0.01 sek. Hvis jeg tilføjer "OR CONTAINS(DocumentStatus.*,
>> '"*kontor*"')" til denne query, tager det pludselig ca. 30 sek. at
>> gennemsøge fritekstkataloget. Hvad skyldes det dog?
>>
>>
>>
>> SELECT DocumentId, Description, DocumentStatus.[Name] FROM Documents
>> INNER JOIN DocumentStatus ON Documents.StatusId = DocumentStatus.StatusId
>> WHERE CONTAINS(Documents.*, '"*kontor*"')
>>
>> --
>> MKJ
>>
>
> Hvordan ser den 'hurtige' søgning ud?
> Vi er nødt til at kunne se de to alternativer for at se forskellen


Jesper (21-05-2009)
Kommentar
Fra : Jesper


Dato : 21-05-09 18:36

Hvordan performer query'en:

SELECT DocumentId, Description, DocumentStatus.[Name] FROM Documents
INNER JOIN DocumentStatus ON Documents.StatusId = DocumentStatus.StatusId
WHERE CONTAINS(DocumentStatus.*, '"*kontor*"')

Hvis denne query går hurtigt bør du i virkeligheden blot lave din query som
en UNION af ovenstående og din første query.

Kender du til query analyser? Hvad giver den for en query plan? Og er der
forskel på den "estimated query plan" og "actual query plan"?

Et hurtigt langskud: Prøv lige at skrive "INNER LOOP JOIN" i ovenstående
query og se om det giver en positiv forskel.

Bemærk iøvrigt at SQL Server 2005 er væsentligt bedre til full-text
operationer i forhold til SQL Server 2000.


Jesper


"news.tele.dk" <m@ds.dk> wrote in message
news:4a13f645$0$15888$edfadb0f@dtext01.news.tele.dk...
> Den hurtige søgning er den jeg har skrevet (0 sek):
>
> SELECT DocumentId, Description, DocumentStatus.[Name] FROM Documents
> INNER JOIN DocumentStatus ON Documents.StatusId = DocumentStatus.StatusId
> WHERE CONTAINS(Documents.*, '"*kontor*"')
>
> Den langsomme er den samme med et OR fra DocumentStatus tabellen (30 sek):
>
> SELECT DocumentId, Description, DocumentStatus.[Name] FROM Documents
> INNER JOIN DocumentStatus ON Documents.StatusId = DocumentStatus.StatusId
> WHERE CONTAINS(Documents.*, '"*kontor*"') OR CONTAINS(DocumentStatus.*,
>>> '"*kontor*"')
>
> Beklager den kryptiske forklaring.
>
> --
> MKJ
>
> "Gert Krabsen" <fjernkrabsen@fjernkrabsenfjern.dk> wrote in message
> news:4a12d92a$0$90269$14726298@news.sunsite.dk...
>> news.tele.dk skrev:
>>> Hej
>>>
>>> Jeg har en ms sql 2000 database med en Documents table der indeholder ca
>>> 100000 records og en DocumentStatus tabel der indeholder 7 records. Med
>>> nedenstående query kan jeg gennemsøge mit fritekstkatalog, finde de ca.
>>> 500 hits på 0.01 sek. Hvis jeg tilføjer "OR CONTAINS(DocumentStatus.*,
>>> '"*kontor*"')" til denne query, tager det pludselig ca. 30 sek. at
>>> gennemsøge fritekstkataloget. Hvad skyldes det dog?
>>>
>>>
>>>
>>> SELECT DocumentId, Description, DocumentStatus.[Name] FROM Documents
>>> INNER JOIN DocumentStatus ON Documents.StatusId =
>>> DocumentStatus.StatusId
>>> WHERE CONTAINS(Documents.*, '"*kontor*"')
>>>
>>> --
>>> MKJ
>>>
>>
>> Hvordan ser den 'hurtige' søgning ud?
>> Vi er nødt til at kunne se de to alternativer for at se forskellen
>



news.tele.dk (26-05-2009)
Kommentar
Fra : news.tele.dk


Dato : 26-05-09 10:55

"Jesper" <no@spam.com> wrote in message
news:4a1590eb$0$90263$14726298@news.sunsite.dk...
> Hvordan performer query'en:
>
> SELECT DocumentId, Description, DocumentStatus.[Name] FROM Documents
> INNER JOIN DocumentStatus ON Documents.StatusId = DocumentStatus.StatusId
> WHERE CONTAINS(DocumentStatus.*, '"*kontor*"')
>
> Hvis denne query går hurtigt bør du i virkeligheden blot lave din query
> som en UNION af ovenstående og din første query.
>
> Kender du til query analyser? Hvad giver den for en query plan? Og er der
> forskel på den "estimated query plan" og "actual query plan"?
>
> Et hurtigt langskud: Prøv lige at skrive "INNER LOOP JOIN" i ovenstående
> query og se om det giver en positiv forskel.
>
> Bemærk iøvrigt at SQL Server 2005 er væsentligt bedre til full-text
> operationer i forhold til SQL Server 2000.
>
>
> Jesper


SELECT DocumentId, Description, DocumentStatus.[Name] FROM Documents
INNER JOIN DocumentStatus ON Documents.StatusId = DocumentStatus.StatusId
WHERE CONTAINS(DocumentStatus.*, '"*kontor*"') - Denne query performer
fint = 0 sek

Dvs de 2 queries hver for sig kan køres på 0 sek. Det er først når man
bruger OR der er problemer.
UNION virker men da det er en dynamisk sql sætning der bliver lavet i et
windows program vil jeg helst ikke bruge UNION.

"estimated query plan" og "actual query plan" er ens

--
MKJ


Søg
Reklame
Statistik
Spørgsmål : 177417
Tips : 31962
Nyheder : 719565
Indlæg : 6407871
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste