Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Teoreetiline küsimus MS SQL indeksite kohta märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 30.07.2013 11:34:38 Teoreetiline küsimus MS SQL indeksite kohta vasta tsitaadiga

Stsenaarium järgmine: on tabel 6 miljoni kirjega, kust rakendus pärib ridu kahe veeru alusel. Enamasti peaks vastuseks tulema üks rida, mõnikord rohkem, aga harva. Loodud on ka index, mis hõlmab täpselt neid kahte veergu, kumbki neist pole primary key. Hetkel jookseb päring ca 1,5 sekundit.

Kas mingi indeksitega trikitamisega õnnestuks seda veel kiiremaks saada? Igasuguste indeksite ja muude sättungitega saan suhteliselt vabalt toimetada, kuna seda baasi ükski teine rakendus ei kasuta. Rakenduskihis on Java ja Hibernate, aga baasi poolt vaadates ei saa vast neid süüdistada, sest enam lihtsamaks seda päringut ka vast käsitsi ei kirjuta. Juba praegu on Hibernate poolt genereeritud umbkaudu "SELECT * FROM table WHERE this AND that"

Suuremas pildis on päring osa andmete migreerimisest legacy süsteemist uude süsteemi ja migreerimist tahab ca 1,4 miljonit kirjet. Ühe kirje migreerimine võtab koos selle 1,5 sekundit päringuga ca 3 sekundit ja sellises tempos on kogu töö kestus poolteist kuud. Seega, kui saaks päringust veel mingi pool sekundit või sekund maha, oleks summaarne ajavõit arvutatav päevades, et mitte öelda nädalates.

Kui on vaja lisainfot, siis jagan võimaluse piires ja anonümiseeritult.. icon_smile.gif

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
Mnator
HV Guru

liitunud: 18.10.2007



Online

sõnum 30.07.2013 11:56:18 vasta tsitaadiga

Proovi siiski C++ ära. Ehki väidad nagu java poleks pidur.
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
Renka
HV Guru
Renka

liitunud: 01.04.2002




sõnum 30.07.2013 12:04:36 vasta tsitaadiga

Fukiku, ma ei saa nüüd aru kas tegu on konreetselt päringu peale kuluva ajaga või läheb sinna sisse ka kogu muu overhead mis tuleneb Java ja ühenduse loomise poolelt?

Muidu alati on päringute puhul ju abiks EXPLAIN icon_rolleyes.gif Või misiganes analoog MSSQL'il ka ei ole.

_________________
There is no place like 127.0.0.1
Kommentaarid: 71 loe/lisa Kasutajad arvavad:  :: 2 :: 1 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 30.07.2013 12:07:20 vasta tsitaadiga

Ma ei näe, kuidas saab Java pidur olla, kui ma rakenduse poolt näen, et asi seisab päringu taga 1,5 sekundit ja ka SQL Serveri activity monitor näitab päringu kestuseks ~1500 millisekundit. Kõrval teine päring view pihta, mille taga on viis tabelit, jookseb 100 millisekundiga ja on ka rakenduse poolt vaadates väga kiire, samas seal ei ole muid piiravaid tingimusi peale tabelite omavahelise joinimise. Ühe suht primitiivse WHERE tingimusega lendas selle kestus ka nelja sekundi peale.. aga see oli näpukas, seda tingimust polnud tegelikult vaja.

Ühesõnaga - ma ei näe, et pidur oleks rakenduskihis. Pealegi, uues keeles rakenduse uuesti kirjutamine võtaks mul ilmselt kogu selle aja ära, mida ma hüpoteetilise jõudluse kasvuga säästaks.. icon_smile.gif

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
Renka
HV Guru
Renka

liitunud: 01.04.2002




sõnum 30.07.2013 12:14:56 vasta tsitaadiga

Fukiku, see on ju lihtsalt testitav. Lase sama päring otse baasis käima.

Igatahes kui see rakenduse osa on välistatud eks siis tuleb baasi poolelt aadata, et kuidas indekseid kasutatakse. EXPLAIN PLAN vmt analoog on ju sellejaoks täpselt õige tööriist. Võibolla ei kasutatagi indekseid millegi pärast? Või on ehk mälu nii vähe füüsiliselt (või virtuaalselt piiratud), et indekseid ei hoitagi mälus ning kettalt lugemine võtab aega? Või on siis andmemahud mis liiguvad serverite vahel niivõrd suured, et kaob aeg sinna?

Samas IMHO peaksid sa selliseid elementaarseid debugimise meetodeid ju minust paremini teadma icon_razz.gif

_________________
There is no place like 127.0.0.1
Kommentaarid: 71 loe/lisa Kasutajad arvavad:  :: 2 :: 1 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 30.07.2013 12:45:25 vasta tsitaadiga

Renka, baasi optimeerimist ja debugimist pole eriti ette tulnud varem. Seega selles vallas nii kõva käpp ei ole.

Hetkel aga hablasin lahti, milles küsimus on vist ja ega sel viisil suurt vist midagi teha ka pole.. kuigi ma natuke uurin veel. Ühesõnaga, Hibernate genereerib sellise päringu:
sql:
  1. SELECT * FROM dbo.pacs_dosr_study pacsdosrst0_ WHERE pacsdosrst0_.accession_number= @P0  AND pacsdosrst0_.patient_id= @P1

Sinna pannakse siis päringu tegemise ajal õiged väärtused sisse. Tulemuseks on selline execution plan ja 1,5 sekundit runtime.
Spoiler Spoiler Spoiler

SSMS kaudu käsitsi sama päringut tehes sellisel kujul tehes:
sql:
  1. SELECT * FROM dbo.pacs_dosr_study pacsdosrst0_ WHERE pacsdosrst0_.accession_number= 'zzz'  AND pacsdosrst0_.patient_id= 'xxx'
Execution plan selline ja jookseb nagu õlitatud välk:
Spoiler Spoiler Spoiler


Kui nüüd õnnestuks kuidagi Hibernate'i päringule see plan peale suruda, siis oleks juba päris äge. icon_razz.gif Must investigate further.

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
Renka
HV Guru
Renka

liitunud: 01.04.2002




sõnum 30.07.2013 12:57:06 vasta tsitaadiga

Fukiku, vaata ehk on sellest abi: http://msdn.microsoft.com/en-us/library/bb510478(v=sql.105).aspx

Peaks teoorias forcema Index Seek'i.

_________________
There is no place like 127.0.0.1
Kommentaarid: 71 loe/lisa Kasutajad arvavad:  :: 2 :: 1 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mattiaza
HV kasutaja
mattiaza

liitunud: 15.07.2002




sõnum 30.07.2013 13:11:23 vasta tsitaadiga

Kas MSSQLis on olemas (või üldse vajalik) midagi sarnast PostgreSQLi "VACUUM ANALYZE" käsule?

PostgreSQLis see "defragmenteerib" tabelis olevaid andmeid, garbage collect'ib kustutatud kirjeid ja arvutab uued statistilised näitajad tabeli suuruse ja väärtuste jaotuse kohta. Vahel kui planeerija halba execution plani (seeki asemel scanid) pakub, siis põhjuseks on aegunud statistilised näitajad.
Kommentaarid: 25 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 25
tagasi üles
vaata kasutaja infot saada privaatsõnum
DoS
HV veteran
DoS

liitunud: 19.08.2002




sõnum 30.07.2013 13:19:01 vasta tsitaadiga

Mis tüüpi need väljad on? Võimalik, et tegu on selle NVARCHAR vs VARCHAR probleemiga:

http://stackoverflow.com/q/6544865
http://stackoverflow.com/q/1306774
http://stackoverflow.com/q/5237280
jne.
Kommentaarid: 50 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 47
tagasi üles
vaata kasutaja infot saada privaatsõnum
iFlop
Kreisi kasutaja
iFlop

liitunud: 03.05.2003



Autoriseeritud ID-kaardiga

sõnum 30.07.2013 14:18:04 Re: Teoreetiline küsimus MS SQL indeksite kohta vasta tsitaadiga

Äkki on võimalik (vajalike) andmeid korraga eksportida ning mingit muud teed pidi uude süsteemi importida? Juhul kui üks kirje on näiteks 1kB, siis peaks see isegi mällu mahtuma: 6 miljoni kirjet ~6GB ja 1,4m ~1,4GB icon_rolleyes.gif
Kui peaksid javas tegutsema, siis mingisugune hashmap oleks ehk abiks...
Kommentaarid: 67 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 66
tagasi üles
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 30.07.2013 15:36:58 vasta tsitaadiga

Tõenäoliselt tead seda isegi, aga nii igaks juhuks lisan, et ka väljade järjekord indeksis on oluline. Ehk siis peaks andmetele otsa vaatama ja panema indeksis esimeseks välja selle, mis andmete hulka rohkem kitsendab. Kui need on umbes 50-50, siis muidugi vahet pole.

Kui seal migreerimise osas väga keerukat äriloogikat taga pole, siis võib alternatiiv ka see olla, et tõmmata need 1,4 miljonit kirjet kuhugi tabelisse ja teha migreerimiseks stored proc või siis kasutada vahendit, mis suudab päringud mssql jaoks paremal kujul ette sööta.
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 30.07.2013 19:10:37 vasta tsitaadiga

Tänud kõiki kaasa mõtlemast, peaauhinna saab sedakorda DoS beer_yum.gif

Selgus, et kühvel suuresti oligi selles, et väljad olid VARCHAR, aga MS SQL'i JDBC draiver vaikimisi saatis kõik parameetrid baasi NVARCHAR tüübina. Kuna tüübid täpselt ei sobinud, siis läks index seek asemel käiku index scan, mis oli kosmiliselt aeglasem. Kõige lihtsam ja valutum lahendus oli hetkel asjakohased väljad NVARCHAR'iks konverteerida ja index uuesti ehitada. Sain päringu kiiruse millisekunditesse.

Tänud veel kord kaasa mõtlemast. icon_smile.gif Sain ka ise jälle palju targemaks.

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Teoreetiline küsimus MS SQL indeksite kohta
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.