What is faster? C++ vector sort or sort in database

Discussion in 'C++' started by JerryJ, Apr 24, 2004.

  1. JerryJ

    JerryJ Guest

    I have to fetch values from a database and store them in a vector in
    my c++ application.

    What is faster? if i fetch the values sorted from the database with a
    'order by' clause in the sql-statement or if i fetch them into the
    vector unsorted and sort the vector then?


    Thanx for your help


    Greetz

    Jens
    JerryJ, Apr 24, 2004
    #1
    1. Advertising

  2. "JerryJ" <> wrote in message
    news:...
    > I have to fetch values from a database and store them in a vector in
    > my c++ application.
    >
    > What is faster? if i fetch the values sorted from the database with a
    > 'order by' clause in the sql-statement or if i fetch them into the
    > vector unsorted and sort the vector then?
    >
    >
    > Thanx for your help
    >


    There is only one way to answer that, try them both and time it.

    john
    John Harrison, Apr 24, 2004
    #2
    1. Advertising

  3. JerryJ

    Mike Wahler Guest

    "JerryJ" <> wrote in message
    news:...
    > I have to fetch values from a database and store them in a vector in
    > my c++ application.
    >
    > What is faster? if i fetch the values sorted from the database with a
    > 'order by' clause in the sql-statement or if i fetch them into the
    > vector unsorted and sort the vector then?


    The faster method will be the one which consumes
    the least amount of time. Only one way to determine
    that.

    -Mike
    Mike Wahler, Apr 24, 2004
    #3
  4. JerryJ

    Julie Guest

    JerryJ wrote:
    >
    > I have to fetch values from a database and store them in a vector in
    > my c++ application.
    >
    > What is faster? if i fetch the values sorted from the database with a
    > 'order by' clause in the sql-statement or if i fetch them into the
    > vector unsorted and sort the vector then?
    >
    > Thanx for your help
    >
    > Greetz
    >
    > Jens


    That question can not be generally answered, there are just too many external
    factors that can determine performance.

    Your only option is to examine the performance empirically between each method
    and make a decision at that point.
    Julie, Apr 24, 2004
    #4
  5. On 4/24/2004 11:19 AM, JerryJ wrote:
    > What is faster? if i fetch the values sorted from the database with a
    > 'order by' clause in the sql-statement or if i fetch them into the
    > vector unsorted and sort the vector then?


    I'm not going to answer your question directly, but
    I'd do use 'order by' in SQL statement rather than vector sort function.
    You may increase performance creating some indexes in your database
    (indexes are one of the factor influencing the performance).

    If you are creating client-side solution and your application
    queries database working on other machine it would be better
    to sort results on the 'server-side' using SQL.

    Greets

    --

    Mateusz £oskot
    mateusz at loskot dot net
    =?ISO-8859-2?Q?Mateusz_=A3oskot?=, Apr 24, 2004
    #5
  6. JerryJ

    Cy Edmunds Guest

    "JerryJ" <> wrote in message
    news:...
    > I have to fetch values from a database and store them in a vector in
    > my c++ application.
    >
    > What is faster? if i fetch the values sorted from the database with a
    > 'order by' clause in the sql-statement or if i fetch them into the
    > vector unsorted and sort the vector then?
    >
    >
    > Thanx for your help
    >
    >
    > Greetz
    >
    > Jens


    I agree with the other posters who said to time it, but in general I would
    say that if you have a decent database program it should not be necessary to
    duplicate basic SQL functionality for performance reasons. If it *does*
    prove necessary, change database programs.

    --
    Cy
    http://home.rochester.rr.com/cyhome/
    Cy Edmunds, Apr 24, 2004
    #6
  7. JerryJ

    Rakesh Kumar Guest

    There are many factors out here -

    i) Where is your DB server ? Is it on a different machine than yours.
    When you get the values and use vector, you are doing it on the DB
    client, whereas executing DB queries would mean you are doing things on
    the server.
    Generally , the server is much more powerful ( people invest more on
    servers than on clients). Hence it would be better to do the task on the
    DB itself, rather than in C++ .


    ii) Assuming still that the DB and the C++ code run on the same machine,
    it would still make sense to have it on the DB, since the DB engine
    generally comes up with optimizations to improve locality of reference
    when they execute the code ( to reduce 'thrashing' in particular).
    While, of course, that could be done in C++ , you need to decide if
    the time spent on that is worth investing.

    HTH


    JerryJ wrote:

    > I have to fetch values from a database and store them in a vector in
    > my c++ application.
    >
    > What is faster? if i fetch the values sorted from the database with a
    > 'order by' clause in the sql-statement or if i fetch them into the
    > vector unsorted and sort the vector then?
    >
    >
    > Thanx for your help
    >
    >
    > Greetz
    >
    > Jens


    --
    Rakesh Kumar
    ** Remove nospamplz from my email address for my real email **
    Rakesh Kumar, Apr 25, 2004
    #7
  8. JerryJ

    Siemel Naran Guest

    "Rakesh Kumar" <> wrote in message
    news:408b1721

    > Generally , the server is much more powerful ( people invest more on
    > servers than on clients). Hence it would be better to do the task on the
    > DB itself, rather than in C++ .


    OTOH, the server is serving thousands of people, but the client serves just
    one person. So it could still be faster to do the sorting on the client
    side.
    Siemel Naran, Apr 28, 2004
    #8
  9. JerryJ

    Siemel Naran Guest

    "JerryJ" <> wrote in message

    > I have to fetch values from a database and store them in a vector in
    > my c++ application.
    >
    > What is faster? if i fetch the values sorted from the database with a
    > 'order by' clause in the sql-statement or if i fetch them into the
    > vector unsorted and sort the vector then?


    Generally, sorting on server is faster. Moreover, using ORDER BY in the
    select statement could encourage the database to use the right index and do
    no sort at all, so your performance will be super-fast. This is especially
    invaluable for large datasets.

    OTOH, if you read a list of names, then the user clicks the last name to
    sort by last name, then the clicks first name to sort by first name, then
    clicks city to sort by city, etc, then it might be better to do all the
    sorting on the client side.

    Of course, this means loading all the data into the std::vector, which might
    not be possible or advised because there are so many records.

    Sorry, no fixed answer to the question.
    Siemel Naran, Apr 28, 2004
    #9
  10. JerryJ

    Dave Moore Guest

    (JerryJ) wrote in message news:<>...
    > I have to fetch values from a database and store them in a vector in
    > my c++ application.
    >
    > What is faster? if i fetch the values sorted from the database with a
    > 'order by' clause in the sql-statement or if i fetch them into the
    > vector unsorted and sort the vector then?
    >
    >
    > Thanx for your help
    >
    >
    > Greetz
    >
    > Jens


    Instead of std::vector, why not use a std::map<Key, record>, where key
    is the data to be used as a sorting criterion. If the compare
    operation is already defined (like for a built-in data type), then you
    can just use subscripting or the insert function to make the map,
    which will automatically be sorted. If you need to define a user
    specific compare operation, you can specify the appropriate functor as
    a template parameter or ctor argument.

    Also, I don't know anything about SQL's interaction with C++ in
    particular, but if it is possible to get only pointers to the records
    (IOW std::map<Key, record *>), that will avoid copying the records,
    which will probably save time.

    Oh .. I just re-read your post and saw you said "values from the
    database" ... if you really just want an ordered list of comparable
    values, you can use std::set (instead of std::map) as above ... this
    might even be more efficient.

    HTH, Dave Moore
    Dave Moore, Apr 28, 2004
    #10
  11. JerryJ

    Siemel Naran Guest

    "Dave Moore" <> wrote in message

    > Instead of std::vector, why not use a std::map<Key, record>, where key
    > is the data to be used as a sorting criterion. If the compare
    > operation is already defined (like for a built-in data type), then you
    > can just use subscripting or the insert function to make the map,
    > which will automatically be sorted. If you need to define a user
    > specific compare operation, you can specify the appropriate functor as
    > a template parameter or ctor argument.


    But lookup and iteration on a sorted vector is faster than on a map. If
    you're doing a lot of lookup, but not much inserting of new rows (or you are
    inserting lots of new rows but don't care that the new rows are sorted which
    is IMHO acceptable), then vector is probably faster.


    > Also, I don't know anything about SQL's interaction with C++ in
    > particular, but if it is possible to get only pointers to the records
    > (IOW std::map<Key, record *>), that will avoid copying the records,
    > which will probably save time.
    >
    > Oh .. I just re-read your post and saw you said "values from the
    > database" ... if you really just want an ordered list of comparable
    > values, you can use std::set (instead of std::map) as above ... this
    > might even be more efficient.
    >
    > HTH, Dave Moore
    Siemel Naran, Apr 28, 2004
    #11
  12. JerryJ

    Dave Moore Guest

    "Siemel Naran" <> wrote in message news:<LvQjc.58845$>...
    > "Dave Moore" <> wrote in message
    >
    > > Instead of std::vector, why not use a std::map<Key, record>, where key
    > > is the data to be used as a sorting criterion. If the compare
    > > operation is already defined (like for a built-in data type), then you
    > > can just use subscripting or the insert function to make the map,
    > > which will automatically be sorted. If you need to define a user
    > > specific compare operation, you can specify the appropriate functor as
    > > a template parameter or ctor argument.

    >
    > But lookup and iteration on a sorted vector is faster than on a map. If
    > you're doing a lot of lookup, but not much inserting of new rows (or you are
    > inserting lots of new rows but don't care that the new rows are sorted which
    > is IMHO acceptable), then vector is probably faster.
    >


    Ok, I hadn't thought about that ... one reason I choose std::map's for
    this sort of thing is because pointers and references are not
    invalidated when elements are inserted to or erased from it. That way
    my std::map<Key, record *> can grow and shrink without worrying about
    the pointers being clobbered. I typically use technique for building
    associative arrays of fairly large objects, where copying is
    expensive. However my arrays never get that big, so that is probably
    why I don't notice performance hits for lookup and/or iteration.

    Thanks for the clarification,

    Dave Moore
    Dave Moore, Apr 28, 2004
    #12
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. pmatos
    Replies:
    6
    Views:
    23,784
  2. Zhang Le
    Replies:
    1
    Views:
    368
    Terry Reedy
    Mar 4, 2005
  3. Replies:
    8
    Views:
    1,914
    Csaba
    Feb 18, 2006
  4. Javier
    Replies:
    2
    Views:
    559
    James Kanze
    Sep 4, 2007
  5. Rushikesh Joshi
    Replies:
    0
    Views:
    357
    Rushikesh Joshi
    Jul 10, 2004
Loading...

Share This Page