Avatar billede Monkeybrain Juniormester
21. juni 2016 - 01:46 Der er 11 kommentarer

en måde til at gøre MSSQL hurtigere til at loade 100-200 posteringer..

Hej som i overskriftet har jeg brug for en konket kode så jeg kan forstå hvornår man gør MSSQL hurtigere til indlæsningen.zz
Avatar billede arne_v Ekspert
21. juni 2016 - 01:58 #1
Umuligt at sige uden at kende tabel struktur, SQL, ASP kode.
Avatar billede Monkeybrain Juniormester
21. juni 2016 - 08:53 #2
formular.commandtext="SELECT CS_GameRiders.RidersID, CS_Riders.RidersName, CS_GameRiders.CostValue FROM CS_GameRiders INNER JOIN CS_Riders ON CS_GameRiders.RidersID=CS_Riders.RidersID WHERE CS_GameRiders.GameID = ?"

Kan det her hjælpe?
Avatar billede Monkeybrain Juniormester
21. juni 2016 - 08:53 #3
Overvejer at laver json filer istedet, vil det give mening?
Avatar billede Rune1983 Ekspert
21. juni 2016 - 10:37 #4
Hvis det er data man kalder ofte kan man oprette et view af data. Så ligger data klar og loades hurtigere efter min erfaring.
Tag dit SQL kald nedenfor og opret et view af det fx. View_GameRiders
SELECT
c.RidersID, c.RidersName, c.CostValue
FROM CS_GameRiders  c
INNER JOIN CS_Riders r
ON c.RidersID=r.RidersID

Når du henter data kalder som nedenfor.
SELECT * FROM View_GameRiders WHERE RidersID='?'

Håber det kan hjælpe.
Avatar billede arne_v Ekspert
21. juni 2016 - 14:47 #5
Er der index paa felterne:

CS_GameRiders.RidersID
CS_Riders.RidersID
CS_GameRiders.GameID

(der er implicit index paa primaer noegler)
Avatar billede arne_v Ekspert
21. juni 2016 - 15:17 #6
Jeg har derimod ikke meget fidus til at et view vil forbedre performance.

(et materialized view vil, men ...)
Avatar billede Monkeybrain Juniormester
22. juni 2016 - 07:34 #7
Jeg kunne heller ikke forestille mig view skulle gøre det hurtigere. Hvad jeg kunne læse mig frem tid var Index det eneste rigtige. Men vil koden så være

SELECT CS_GameRiders.RidersID, CS_Riders.RidersName, CS_GameRiders.CostValue FROM CS_GameRiders WITH(INDEX(GameRidersIndex)) INNER JOIN CS_Riders WITH(INDEX(RidersIndex)) ON CS_GameRiders.RidersID=CS_Riders.RidersID

altså efter jeg har lavet index'et..
Avatar billede arne_v Ekspert
22. juni 2016 - 15:28 #8
Du skal ikke lave om paa den SQL. Databasen finder selv ud af at bruge index.
Avatar billede Monkeybrain Juniormester
23. juni 2016 - 22:41 #9
jeg har gjort sådan at når man tilføjer en rytter til en af de to database så opdatere den index på denne måde

            SQL = "DROP INDEX CS_Riders.RidersIndex"
            Set rs = Server.CreateObject("ADODB.Recordset")
            rs.Open SQL, Conn
            Set rs = Nothing
           
            SQL = "CREATE INDEX RidersIndex ON CS_Riders (RidersID)"
            Set rs = Server.CreateObject("ADODB.Recordset")
            rs.Open SQL, Conn
            Set rs = Nothing
           
            SQL = "DROP INDEX CS_GameRiders.GameRidersIndex"
            Set rs = Server.CreateObject("ADODB.Recordset")
            rs.Open SQL, Conn
            Set rs = Nothing
           
            SQL = "CREATE INDEX GameRidersIndex ON CS_GameRiders (GameID, RidersID)"
            Set rs = Server.CreateObject("ADODB.Recordset")
            rs.Open SQL, Conn
            Set rs = Nothing

Men den tager stadig 4,20 sek om at loade det hele.. kan det være fordi jeg har for mange database udtræk?
Avatar billede Monkeybrain Juniormester
23. juni 2016 - 23:11 #10
Hej Fejlen er fundet :-D

Under mine udtræk af alle rækker (ca. 200 stk) lå denne djævel og gemte sig :-)

Det er self. lagt sammen med den øverste i en triple inner join :-)

                    Set formular = Server.CreateObject("ADODB.Command")
                    set formular.ActiveConnection = conn
                    formular.Prepared = true

                    formular.commandtext="SELECT CS_Riders.RidersTeamID, CS_Riders.RidersID, CS_RidersTeam.RidersTeamID, CS_RidersTeam.TeamName FROM CS_Riders INNER JOIN CS_RidersTeam ON CS_Riders.RidersTeamID=CS_RidersTeam.RidersTeamID WHERE CS_Riders.RidersID = ?"
                    set teamrs = formular.execute(, array(rs("RidersID")))
                                   
                    if teamrs.EOF or BOF then
                   
                   
                    else   
                   
                    response.write teamrs("TeamName")
                   
                    end if
                    teamrs.Close
                    Set teamrs = Nothing

og load tiden blev pludselig reduceret til under 1 sek. :-)

Tusind tak for hjælpen Arne, ikke mindst for at lære mig om index :-)
Avatar billede arne_v Ekspert
24. juni 2016 - 01:21 #11
Du behoever ikke goere noget med index naar du laver en INSERT. Databasen opdaterer selv index.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester