 |
Infralution Support Support groups for Infralution products
|
View previous topic :: View next topic |
Author |
Message |
mos
Joined: 19 Nov 2006 Posts: 4
|
Posted: Thu Feb 08, 2007 11:57 pm Post subject: Grabbing a VRecord from a VRecordset is very slow |
|
|
Hi Infralution,
I'm again in trouble with my database. I simply like to get one vrecord out of round about 3000 vrecords. My Code:
Code: | VirtualConnection vc = new VirtualConnection("dsn=mydsn", "login", "pwd", 0, 2);
vc.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
vc.CursorType = ADODB.CursorTypeEnum.adOpenKeyset;
VirtualRecordset vrs = new VirtualRecordset(vc, "clients", "id", "SELECT * FROM clients ORDER BY id");
VirtualRecord vr = vrs[2];
MessageBox.Show(vr["id"].ToString());
vc.Close(); |
After 57 secs i get the desired information. Why does it take so long? The same problem when i try to get the amount of records in the recordset.
It seems to me, that the complete recordset is copied into the client memory.
Is there a way to fasten up this process?
Thank you,
Marc |
|
Back to top |
|
 |
Infralution
Joined: 28 Feb 2005 Posts: 5027
|
Posted: Fri Feb 09, 2007 6:24 am Post subject: |
|
|
That definitely is very slow. You are using a client side cursor which does mean that ADO will copy the data into memory - however I have used clientside cursors on much larger databases than yours without seeing this sort of performance problem. Generally you will get better performance out of server side cursors - however some databases don't fully support bidirectional server side cursors which means you have to use a client side cursor.
You should perhaps try some raw ADODB code and check the performance of your database with that. For instance try the following:
Code: | ADODB.Connection cn = new ADODB.ConnectionClass();
cn .CursorLocation = ADODB.CursorLocationEnum.adUseClient;
cn.Open("dsn=mydsn", "login", "pwd", 0);
Recordset rs = new ADODB.RecordsetClass();
rs.Open("SELECT * FROM clients ORDER BY id", cn, CursorTypeEnum.adOpenKeyset, LockTypeEnum.adLockOptimistic, -1);
int count = rs.RecordCount;
rs.AbsolutePosition = 2;
object id = rs.Fields["id"].Value; |
If this code takes a long time to execute then you could try changing the CursorLocation to a server side cursor or the CursorType - but I would probably talk to your database provider about why their ADO bindings are so slow. Unfortunately if the underlying ADO provider performance is terrible for some reason then this will affect Virtual Data Object performance. _________________ Infralution Support |
|
Back to top |
|
 |
mos
Joined: 19 Nov 2006 Posts: 4
|
Posted: Mon Feb 19, 2007 2:36 am Post subject: |
|
|
Thank you for your quick answer.
Yes, you are right. It seems to be a problem with the database driver, i have to use. It takes the same time when I try the query directly with ADODB. And I get better response times when using other databases.
Nevertheless, I found some strange reaction in der Virtualconnection: I am unable to use a server-side cursor. When try a server-side cursor directly with ADODB it works fine, but when I try it using a Virtualconnection, the program throws a COMException (multiple-steps...). It seems, that my driver can't count the records when using a server-side cursor. And it seems, that you use this ADODB function in your code, so it produces an error. Am i right? Is there a work around?
Thank you,
Marc |
|
Back to top |
|
 |
Infralution
Joined: 28 Feb 2005 Posts: 5027
|
Posted: Mon Feb 19, 2007 3:22 am Post subject: |
|
|
Quote: | It seems, that my driver can't count the records when using a server-side cursor. And it seems, that you use this ADODB function in your code, so it produces an error. Am i right? Is there a work around? |
You are right, Virtual Data Objects requires the database provider to implement the RecordCount property. Some providers do not do this for server side cursors. Client side cursors are implemented by ADODB (and not the provider) and so can be relied on to implement the RecordCount property. So the workaround is to use a Client side cursor.
Did you test the raw ADODB with both client and server side cursors? If so was the performance any different? _________________ Infralution Support |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|