Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    Migliorare prestazioni server sql

    Ciao a tutti.
    Ho da risolvere un problema in cui non mi ero mai imbattute.
    In pratica, gestisco un sito realizzato con asp e con data sql server express.
    Il sito è appoggiato su due server (uno per iis e uno per il db) su cui gira solo questo sito.
    Due anni fà faceva un bel pò di visite, poi l'estate scorsa si sono raddoppiate e abbiamo facendo rallentare molto le pagine in alcuni momenti di picco di visite.
    Durante questo aumento già avevo fatto qualche modifica per migliorare alcune cosette che non andavano, e dopo il picco dell'estate scorsa ho lavorato per migliorare altre query e parti dell'applicazioni per cercare di rendere il tutto più veloce.
    A distanza di un anno abbiamo quadruplicato le visite, e l'applicazione regge abbastanza bene, tranne alcuni picchi in cui il database si rallenta tantissimo.
    Analizzando i due server il problema l'abbiamo propri sulla macchina dove risiede il database, dove normalmente la cpu è sul 70% arrivando a volte anche al 100%.
    Mentre la macchina con iis la cpu è utilizzata molto di meno.
    Onestamente in questo momento non vedo molte soluzioni per poter cambiare e migliorare l'applicazione, quindi vorrei lavare sul db.
    Vi faccio alcune domande

    1)Sql server a differenza di Sql server express è più prestante, ovvero se faccio cambiare le versione ottengo dei miglioramenti, o considerato che l'applicazione fa sopratutto select e insert nelle tabelle, non ottengo miglioramenti?

    2)Secondo voi posso dividere in qualche modo il database, ovvero installare un altro db sulla macchina iis e portarmi alcune tabelle sull'altra macchina, e interrogare a secondo dell'esigenza a volte un db e a volte un altro

    3) dividendo il database avrei realmente un miglioramento delle prestazioni, ovvero si dividerebbe il carico di lavoro, ma poi avendo due connessioni diverse riuscire veramente a non avere rallentamenti, o comunque poi le cpu sono un pò più basse ma va lento per altri problemi?

    4)Non avendo mai riscontrato questo problema, ne essendo un dba, mi chiedo ma grossi siti che fanno milioni di visite come fanno? Se è un sito tipo ebay, dove ha milioni di prodotti, che a secondo delle ricerche ti deve dare prodotti e prezzi diversi, e prezzi che si aggiornano da minuto a minuto, loro come fanno?

    Ciao e grazie a tutti

  2. #2
    beh, tutto dipende da quante query fai e da come è scritto il tuo codice

    considera che sebbene il 70% della CPU utilizzata indica, ovviamente un consumo di risorse, non per forza indica che il problema è nel database

    potrebbe benissimo essere nelle pagine che sono lente ad essere eseguite e non caricano la macchina durante l'esecuzione stessa (ovviamente è solo un'ipotesi)

    Il sito è scritto in ASP (classic intendo non .NET)? Perché se si ... dovresti guardare a lui prima di guardare al database
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  3. #3
    Utente di HTML.it L'avatar di comas17
    Registrato dal
    Apr 2002
    Messaggi
    6,522
    Non hai detto che caratteristiche hanno i server su cui sono installati (se mi dici che il DB è installato in un Pentium III con 512 MB di RAM capisci da solo che... )

    Detto questo:

    1) SQL Server Standard è sicuramente più performante della versione Express più che altro perchè non ha alcune delle limitazioni della Express e che potrebbero essere significative; per esempio la Express usa al massimo 1 CPU (anche se he hai di più) e soprattutto usa al massimo 1 GB di RAM (che, contando che SQL Server è notoriamente "assetato" di RAM, potrebbe essere poco)

    2) Escluderei di dividere il database (quantomeno non nel senso che indichi tu, cioè installandone un altro nella macchina IIS). Nei casi in cui il carico è davvero pesante si possono installare dei cluster (insiemi di più server che eseguono tutti SQL Server e vengono visti come "una cosa unica" e si spartiscono il carico) ma nel tuo caso mi sembra un po' ardito passare dalla versione Express (gratuita) ad un cluster...

    Tieni presente che un ruolo MOLTO, MOLTO, MOLTO importante ce l'ha il database stesso, cioè il modo in cui è stato progettato (le tabelle, i campi, i tipi di dato utilizzati, l'uso di indici, l'uso di viste, l'uso di stored procedures, etc)
    Prova a riesaminare le tue tabelle, quanto grandi sono, quanti record contengono, che tipo di operazioni vengono fatte, etc (una select * from una tabella da 5 milioni di record usando come condizione di ricerca una data, ad esempio....

    4) Non usano SQL Express, usano cluster, usano Oracle, usano SQL Server Enterprise, usano database veramente ottimizzati ...

  4. #4
    Ciao,
    intanto grazie per avermi risposto.

    cercherò di rispondere al meglio a entrambi

    Utilizzo asp classico, so che asp.net sarebbe molto più performante, ma negli ultimi due anni ho lavorato sull'ampliamento del sito e del suo gestionale, con funzionalità e miglioramenti, cambiare tutto in asp.net era complicato già due anni fà ora lo sarebbe ancora di più, ma non è una cosa che non ho messo tra le cose da considerare.
    In questi ultimi due anni ho sicuramente lavorato sul migliorare le query, eliminato dove non necessitava la select *, messo diverse store procedute, messo le chiavi primarie, ridotto le dimensioni di campi sovradimmensionati, anche se poi ho dovuto aggiungerne di nuovi.
    Periodicamente cancello record molto vecchi non più utilizzati.

    Tra le cose che sto pensando di fare in questi giorni, c'è quella di creare dei duplicati delle tabelle + grandi con tutti i dati, che non sono obsoleti, ma che utilizziamo di meno, dati vecchi a cui si accede di rado, e poi cancellare dalle tabbe principali tutti i record che sono nei duplicati, in modo da avere meno record su quelle tabelle principali

    La macchina su cui risiede il db è così costituita

    Processore Xeon Quad Core
    4 Gb di Ram
    2 dischi Raid 1 da 160 Gb
    Windows 2003
    MsSql Express

    Il database è grande, ma non immenso ci sono una 50 di tabelle di cui quelle principali e davvero piene sono un 4 o 5, ci sono in queste tabelle più piene circa un 200.000 record
    ognuna


    questa è la dimensione attuale 1289.38 MB
    questo lo spazio allocato 156.23 MB

    Tutte le tabelle contengono le chiavi primarie, che però non ho indicizzato

    due i queste tabelle (quella + utilizzata) hanno circa un 120 campi, che purtroppo sono utilizzati al 90%, quindi non li posso eliminare.
    Queste tabelle lo utilizzo sempre con delle condizioni, ovvero se apro un record per visualizzare tutti i 120 campi, lo faccio per un record alla volta, non faccio una select con delle condizioni molto ampie , quindi è vero che tiro fuori 120 dati, ma per un solo record

    Campi text ce ne sono un paio

    la maggior parte delle pagine (quelle che vedono gli utenti) sono select per id univoci, ovvero di singoli prodotti, e non contengono tutti e 120 i campi,

    altre pagine molte viste contengono la lista dei prodotti, paginatte, con delle join con un altra tabella abbastanza grande, ma che tira fuori solo una decina di informazioni

    nel backoffice ci sono alcune pagine che tirano fuori tutti i campi, ma vengono naturalmente visualizzate molto ma molto di meno delle pagine viste dagli utenti, anche se su queste si sente il rallentamento quando la cpu è al massimo


    quando parlate di "potrebbe benissimo essere nelle pagine che sono lente" cosa intendete?
    il problema che vi ho segnalato, non ce l'ho tutti i giorni, ma solo in periodi in cui le visite aumentano a dismisura, come riscendono è tutto di nuovo ok, è come se arrivato a un tot di visite incontrasse improvvisamente delle difficoltà

    l'anno scorso abbiamo aumentato la ram per esempio, perchè arrivati alle 18 la macchina era talmente carica che rallentava, come abbiamo cambiato la ram non abbiamo avuto + problemi

    sto valutando l'ipotesi di passare a sql server standard....voi credete che servi realmente...quelli dell'assistenza al server, mi hanno detto che non sono sicuri che spendere i soldi per quella licenza realmente porti a un contributo.

    Tra le cose che sto pensando di fare in questi giorni, c'è quella di creare dei duplicati delle tabelle + grandi con tutti i dati, che non sono obsoleti, ma che utilizziamo di meno, dati vecchi a cui si accede di rado, e poi cancellare dalle tabbe principali tutti i record che sono nei duplicati, in modo da avere meno record su quelle tabelle principali

    di lavori vari e migliorie, come ho detto in precedenza in questi due anni ne ho fatti, considerato che prima con meno di un quarto delle visite il sito andava + lento di come va ora a pieno carico, la mia problematica per cui vorrei iniziare a lavorare, e se domani aumentano ancora le visite, vorrei lavorare prima che si blocchi tutto

    spero di avervi dato maggiori informazioni, per potermi aiutare.

    Grazie ancora

  5. #5
    Dimenticavo,
    di viste non ne sto usando.
    Faccio qualche prova, credete che migliorino le cose?

    Ciao

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Non penso che con le viste migliori il problema, in quanto relazioni virtuali...
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  7. #7
    Originariamente inviato da ciucciatiilcalzino
    Tutte le tabelle contengono le chiavi primarie, che però non ho indicizzato
    quindi lavori senza indici?

  8. #8
    Tutte le tabelle hanno dei record con un id impostato come un contatore ovvero con incremento di identitità, che non ammette null e che ha la chiave primaria.
    Quando ho aggiunto le chiavi primarie ( prima che iniziassi a occuparmi io del sito non c'erano le chiavi primarie) non le ho aggiunte come indici, avevo paura che invece di fare del bene facessi del male.
    Tutte le query con join vengono richiamate tramite questi id e mai su campi testo

  9. #9
    Originariamente inviato da ciucciatiilcalzino
    Tutte le tabelle hanno dei record con un id impostato come un contatore ovvero con incremento di identitità, che non ammette null e che ha la chiave primaria.
    Quando ho aggiunto le chiavi primarie ( prima che iniziassi a occuparmi io del sito non c'erano le chiavi primarie) non le ho aggiunte come indici, avevo paura che invece di fare del bene facessi del male.
    Tutte le query con join vengono richiamate tramite questi id e mai su campi testo
    quindi lavori senza indici!

    prova ad aggiungerli e vedrai...

  10. #10
    @optime grazie per l'indicazione...a questo punto ti faccio una domanda da ignorante

    quando ho messo le chiavi primarie, lessi qualcosa anche sugli indici, non ricordo bene cosa, ma c'era qualcosa che mi aveva convinto a non metterli per paura che invece di migliorare peggioravo la situazione.
    Se metto gli indici, quali effetti negativi potrei riscontrare?
    Intanto mi riguardo un pò di documentazione
    Ciao e grazie ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.