Eksperci miesiąca

1
grzegorz.tworek
Senior
miesiąc
32
łącznie
813
2
burzak
Guru
miesiąc
21
łącznie
1079
3
Bulax
Senior
miesiąc
21
łącznie
589
4
voytass
Senior
miesiąc
20
łącznie
509
5
coltuszyk
Junior
miesiąc
20
łącznie
209

Biuletyny zabezpieczeń

Microsoft w Polsce

Statystyka

  • W tej chwili mamy:
    473 czytelników online
    60 240 zarejestrowanych
  • Do dziś zanotowaliśmy:
    136 909 958 odsłon
    67 010 odsłon / 24h
Microsoft Most Valuable Professional

Forum - Wątek

Idź do grupy:
Widok:
Autor

Wątek


Akodo_Shado
Gość

wypowiedzi: 39
od: 2008-05-29
Będę na MTS 2010
jak dostroić bazę? Wydajne zapytania. 2008-05-29 (Cz) 23:52
Witam.

Postawiłem sobie bazę w której między innymi mam tabele 'słowa' składającą się kolumn: id bigint, NAME nchar(60), wprowadził nchar(10).

W tabeli znajduje się 3 500 000 słów polskich.
Chciałbym najwydajniej jak się da przeszukiwać ją szukając np. podpowiedzi do błędnie napisanego słowa (coś jak mechanizm sprawdzania pisowni w MS Wordzie).

np. dla niepoprawnego słowa 'kotex' chciałbym dowiedzieć się, że istnieją podpowiedzi:
kotek, kotem, kotew...

Narazie zastosowałem najprostrzy algorytm szukania podpowiedzi, czyli
wymieniam pierwsz literę wyrazu czyli 'k' na kolejne litery alfabetu i sprawdzam czy istnieje w tabeli.
czyli 'Aotex', Botex, Cotex... nie trudno się domyślić, że możliwych kombinacji będzie
długość_alfabetu x długość_słowa. I tyle samo zapytań będę miał.

O ile pojedyńcze zapytanie wykonuje mi się błyskawicznie, o tyle 120 zapytań już nie koniecznie ;)

SELECT [SLOWNIK].[dbo].[SLOWA].[NAME]
FROM [SLOWNIK].[dbo].[SLOWA]
WHERE [SLOWNIK].[dbo].[SLOWA].[NAME] = 'śmotex';

Oczywiście założyłem indeks na pole NAME; Unique, non-clustrered.

Chcialbym o poradę jak mogę dostroić bazę i zapytania aby uzyskać najlepszy efekt.

Próbowałem teraz wykorzystać polecenia z LIKE:

select * from slowa
where RTRIM(name) LIKE 'kote[a-z]';

ale to trwa strasznie długo.

Proszę o pomoc.
Zaloguj się, żeby odpowiedzieć

stasiek.d
Junior

wypowiedzi: 381
od: 2005-12-15

Odp: jak dostroić bazę? Wydajne zapytania. 2008-05-29 (Cz) 23:59
Odrazu żuca się że funkcja nie pozwala wykorzystać indeksu :), proponuje zaklikać tak:
when name LIKE 'kote[a-z]%'


Edytowany 2 razy, ostatnio 2008-05-30 00:05 przez stasiek.d
Zaloguj się, żeby odpowiedzieć

Microsoft Most Valuable Professional (MVP) theos
Guru

wypowiedzi: 2004
od: 2006-04-09


Odp: jak dostroić bazę? Wydajne zapytania. 2008-05-30 (Pt) 01:02
@stasiek
sugestia dobra, ale ja jak czytalem kolegi wypowiedz to wpadlem na taki pomysl...
co jesli zamiast tabeli:
create table old_one( id int, slowo varchar(20))

zrobic cos na kszatalt
create table new_one( id int, char_1 char(1), char_2 char(1), .... , char_20 char(1))


czy wówczas dzieki takiemu ulozeniu danych nie zyskalibyśmy np na porownywaniach i wielu rownoleglych wyszukiwaniach ??? tylko jak potem do dego indeksy dolozyc zeby bylo sensownie...


--
Pozdrawiam
Marcin Goł

{ Zapraszam na: PLSSUG & blog }

Edytowany 3 razy, ostatnio 2008-05-30 01:04 przez theos
Zaloguj się, żeby odpowiedzieć

stasiek.d
Junior

wypowiedzi: 381
od: 2005-12-15



Odp: jak dostroić bazę? Wydajne zapytania. 2008-05-30 (Pt) 01:17
Ciekawe jak by działał mechanizm pokrycia indeksow. Indeksów napchałbym sporo, wkońcu operacja wstawiania nie musi być szybka. Trzeba testować :)
Zaloguj się, żeby odpowiedzieć

Akodo_Shado
Gość

wypowiedzi: 39
od: 2008-05-29
Będę na MTS 2010


Odp: jak dostroić bazę? Wydajne zapytania. 2008-05-30 (Pt) 21:54
dziękuję bardzo za wszystkie odpowiedzi.
Narazie srprawdziałem zapytanie

select name from slowa
where name LIKE 'kote[a-z]%'.
Efekt był piorunujący! 140 wyników w mig.

Dodałem na głupa ograniczenie
and len(name) = 5
i dosałem ładnie tylko 3 ;)

Zdaje się, że _ oznacza dowolny pojedynczy znak, ale chyba go źle używam bo gdy piszę:
select name from slowa
where name LIKE 'kote_';

dostaje pusty rezultat ;/

Konsekwencja tego problemu jest też taka, że

o ile 'kote[a-z]%' robi się błyskawicznie o tyle
'[a-z]%otek' już nie koniecznie.


Dodałem indeks klastrowany. Wydaje się dobrym posunięciem ;)
Zaloguj się, żeby odpowiedzieć

Microsoft Most Valuable Professional (MVP) C3PO
Guru

wypowiedzi: 5296
od: 2005-09-09



Odp: jak dostroić bazę? Wydajne zapytania. 2008-05-30 (Pt) 22:25
select name from slowa
where name LIKE 'kote[a-z]%'.
Efekt był piorunujący! 140 wyników w mig.


I nic dziwnego. Przecież w tych 3,5 mln słów ile mogło się zaczynać od "kote" :-) Naturalne, że przy tak dobrej selektywności serwer może użyć indeksu na polu name (jakiegokolwiek indeksu, warto dodać).

Konsekwencja tego problemu jest też taka, że
o ile 'kote[a-z]%' robi się błyskawicznie o tyle
'[a-z]%otek' już nie koniecznie.


Co w tym dziwnego? W drugim przypadku serwer musi przecież przeszukać praktycznie całą tabelę (od a do z).

--
Pozdrawiam
Paweł Potasiński

[ PLSSUG ] | [ moja strona ] | [ mój blog ]
Zaloguj się, żeby odpowiedzieć

Microsoft Most Valuable Professional (MVP) theos
Guru

wypowiedzi: 2004
od: 2006-04-09




Odp: jak dostroić bazę? Wydajne zapytania. 2008-05-31 (So) 09:32
Pawle czy dzielac wyrazy na pojedyncze litery - jak proponowalem wyzej - nie dalo by sie ominac problemu like '%otex' ???

MG>

--
Pozdrawiam
Marcin Goł

{ Zapraszam na: PLSSUG & blog }
Zaloguj się, żeby odpowiedzieć

radek_kepa
Moderator

wypowiedzi: 2759
od: 2004-05-12





Odp: jak dostroić bazę? Wydajne zapytania. 2008-05-31 (So) 13:54
Jakim zapytaniem chcialbys wyszukiwac wyrazy np. zakladajac ze % chcesz zastapic nieznana liczbe liter co za tym idzie nie wiedzac do ktorych kolumn chcialbys sie odwolywac? Jaki index chcialbys postawic na tej tabeli? Obawiam sie, ze skorka nie warta bedzie wyprawki, ale moze inaczej wyobrazam sobie Twoj pomysl Marcin.

__________________________
Radosław Kępa
radek@kempes.com.pl
Zaloguj się, żeby odpowiedzieć

Akodo_Shado
Gość

wypowiedzi: 39
od: 2008-05-29
Będę na MTS 2010






Odp: jak dostroić bazę? Wydajne zapytania. 2008-05-31 (So) 23:08
wydaje mi się, że przez pierwsze 3 literki trzeba sprawdzić ręcznie wszystkie możliwe kombinacje od a do z. aotek, botek, cotek... Nie wiem.

Może mi ktoś napisać ja napisać taki warunek. Czyli aby pod pierwszą literkę wstawił wszystkie znaki a-z, ale tylko jeden znak.

Edytowany 1 raz, ostatnio 2008-05-31 23:13 przez Akodo_Shado
Zaloguj się, żeby odpowiedzieć

Microsoft Most Valuable Professional (MVP) theos
Guru

wypowiedzi: 2004
od: 2006-04-09




Odp: jak dostroić bazę? Wydajne zapytania. 2008-06-01 (N) 14:24
początkowo miałem ten research umieścić tutaj ... ale rozrósł się wiec trafił na mój blog ...
like '[A-Z]QLServer' vs. like '_QLServer'
http://marcingol.spaces.live.com/blog/cns!16BE9FB20E620F31!195.entry

przy okazji jeśli ktoś korzysta z pulpitów zdalnych może looknąć na to:
mRemote
http://marcingol.spaces.live.com/blog/cns!16BE9FB20E620F31!184.entry

--
Pozdrawiam
Marcin Goł

{ Zapraszam na: PLSSUG & blog }
Zaloguj się, żeby odpowiedzieć

can_do
VIP

wypowiedzi: 951
od: 2007-09-02

Odp: jak dostroić bazę? Wydajne zapytania. 2008-05-30 (Pt) 01:08
Witaj,

Jak zmienisz indeks na klastrowy, to nie przyspieszy on Twoich wyszukiwań?

Co do szukania podobieństwa, to zastanów się nad użyciem wyszukiwania pełnotekstowego, wtedy dostaniesz dodatkowe funkcje FREETEXT oraz CONTAINS, które powinny być szybsze w Twoim wyszukiwaniu. Przed użyciem zbuduj indeks pełnotekstowy (CREATE FULLTEXT INDEX).

--
pozdrawiam
Paweł Kiraga
Zaloguj się, żeby odpowiedzieć

Microsoft Most Valuable Professional (MVP) theos
Guru

wypowiedzi: 2004
od: 2006-04-09


Odp: jak dostroić bazę? Wydajne zapytania. 2008-05-30 (Pt) 01:42
Przyszedl Paweł i mimo późnej pory sensownie doradził :-)

--
Pozdrawiam
Marcin Goł

{ Zapraszam na: PLSSUG & blog }
Zaloguj się, żeby odpowiedzieć

can_do
VIP

wypowiedzi: 951
od: 2007-09-02



Odp: jak dostroić bazę? Wydajne zapytania. 2008-05-30 (Pt) 15:09
:)
E tam, przecież trzeba jeszcze zbudować katalog przed użyciem takiego indeksu, więc to była tylko myśl naprowadzająca.

--
pozdrawiam
Paweł Kiraga
Zaloguj się, żeby odpowiedzieć

Gailard
Junior

wypowiedzi: 268
od: 2005-06-03




Odp: jak dostroić bazę? Wydajne zapytania. 2008-05-31 (So) 00:48
Przy okazji porównywania słów w języku polskim. Czy nie dało by się zaprzęgnąć do tego SOUNDEX i DIFFERENCE? Wiem, że w angielskim to nawet kuleje ale czy ktoś w ogóle próbował w polskim tworzyć jakąś bazę do porównań tym mechanizmem? Czy w ogóle jest sens?
Zaloguj się, żeby odpowiedzieć