Hi all,
I have an Access db with two large tables - 3,100,000 (tblA) and 7,000
(tblB) records. I created a select query using Inner Join by partial
matching two fields (X from tblA and Y from tblB). The size of the db
is about 200MBs.
Now my issue is, the query has been running for over 3 hours already -
I have no idea when it will end. I am using Access 2003. Are there
ways to improve the speed performance? (Also, would the query run
faster if I index the two fields?)
Any helpful suggestion will be appreciated.
- Grasshopper -
Jan 26 '07
27 3247
"SQL Learner" <ex***********@ gmail.comwrote
It is quite a challenge to parse the following format
East 123 ABC Street" or "S. 100 Apple Road
into
Field1 Field2 Field3
-------- --------- ----------------
East 123 ABC Street
S. 100 Apple Road
since there is no comment "delimited character" to use.
Those, of course, are well-structured addresses and, thus, rather easy to
parse. The real problem will be when the addresses aren't well-structured,
and, in real life, they can just be free-form text, such as "Twelve
Intergalactic Circle" or "Worthingto n House" or "One Microsoft Way" or "9876
125th Street SW" or any of many variations.
May be one can use the following logic - split the string using the
first space location before the number (field1), extract the number
using the first and second spaces (field2), and extract the last piece
of data after the last number digest + space (field3).
Implemented correctly, this would work nicely on the well-structured
examples. It wouldn't work so well on free-form addresses, which you are
entirely likely to encounter.
How can I write T-SQL UDFs for these
three fields in Access?
T-SQL (full name Transact SQL) is a feature of Microsoft SQL Server, a
language for writing stored procedures, and triggers. None are supported
in the Jet database engine that is, by default, used with Access. So the
answer is, "You can't."
On the other hand, you can write user-defined-functions (often abbreviated
as UDF) in Access, and call them from Jet SQL. Just bear in mind that,
using Jet, all the work is done on the user's machine.
Using Microsoft SQL Server, a substantial part of the work may be done on
the server, if you have studied, learned well, and properly designed and
implemented stored procedures and triggers on the SQL Server -- which is a
non-trivial skill that will have to be learned, practiced, and perfected in
addition to Access. It is only if you do that study, learning, design, and
implementation that using SQL Server is likely to give you a performance
increase. It is quite common for users to convert their application data
storage to linked server tables, and discover that the application runs
slower rather than faster.
A well-designed, well-implemented single-user standalone database, just
split for multi-user access does not necessarily make a well-designed,
well-implemented multi-user database. A well-designed, well-implemented
multi-user database, with its back-end tables just moved to a server DB does
not necessarily make a well-designed, well-implemented client-server
database. You have to understand how Access works in each environment in
order to take advantage of the benefits of that environment, and to avoid
the stumbling blocks it may put in your path.
Larry Linson
Microsoft Access MVP
"Lyle Fairfield" <ly***********@ aim.comwrote in message
news:11******** **************@ a75g2000cwd.goo glegroups.com.. .
On Jan 27, 10:29 am, "Rick Brandt" <rickbran...@ho tmail.comwrote:
>"SQL Learner" <excelmodel...@ gmail.comwrote in messagenews:11 *************** *******@s48g200 0cws.googlegrou ps.com...
>SQL server would not help unless it was on a machine that had faster disk i/o than the one you have now and you absolutely do NOT want this to run over a network. That would slow i/o to a point that would be brutal.
Please, expand on this. It seems you are relating SQL Server to
running over a network and suggesting that running the query in SQL-
Server "over a network", whatever that would mean, would be slow. I
doubt very much if that is what you mean.
I meant that if run in Access/Jet you would want the file to be local. A
network wouldn't matter to SQL Server and would be expected.
--
Rick Brandt, Microsoft Access MVP
Email (as appropriate) to...
RBrandt at Hunter dot com
Hi Larry,
I am not using SQL Server as the backend and no network is involved.
I have the tables all in Access. The reason why the database is not
well designed is because I just took the data from csv files and
dumpped them into Access. I did not design the database.
You raised a good print regarding the free form address. We would try
to convert all the "not well structured" data into a better structured
data before we run our update query. For example, we would
standardized all the words used in the addresses by, for example,
convert "E." or "E" to "East" or "Five" to "5".
The objective is to get as much update as we can. The "Left over"
will need to be handled manually.
So given these fact and assume that there will be only two type of
structures: "East 123 ABC Street" and "100 Apple Road", how can I
write UDFs to parse them into
into the following:
Field1 Field2 Field3
-------- --------- ----------------
East 123 ABC Street
100 Apple Road
- Grasshopper -
On Jan 27, 4:33 pm, "SQL Learner" <excelmodel...@ gmail.comwrote:
I am not using SQL Server as the backend and no network is involved.
I have the tables all in Access. The reason why the database is not
well designed is because I just took the data from csv files and
dumpped them into Access. I did not design the database.
It's quite likely that you will have to make several passes to
"stroke" your data.
Here's a start in a way I would try. It might not do what is needed.
It might need revision.
It's intended to filter the largest (in characters) numeral in an
address field and to put it into a (type long integer) StreeNumber
field. It's intended to put a null in the field if there is no number
in the address fields, in case some previous effort has made it zero,
or something else that's inappropriate.
For northwinds 830 Customer records this procedure takes 0.01 (one one
hundredth) seconds with my Intel Pntium M 1.5 Processor and 512 meg of
ram. Part of that is taken initializing the Regular expression so we
might expect it to reduce its average time per record as the number of
records increases. But there's no guarantee of anything like that.
Access and VBA and JEt are mysterious beasts and there's no guarantee
that at record 831 there will not be some problem with a cache, or a
disk write or read or whatever and the whole thing will slow to a
crawl.
This is not old proven code. It's new and has been created right now
while I am packing (for that vacation I mentioned). It's very likely
that it can be improved.
If you decide to run it though, please run the whole thing not part of
it. It's unlikely that part of it will behave well. If you are a Reg
Exp/ SQL fiend go right ahead and inporve it. I'll be happy. As for
the other parts, (they're what re(1) to re(3) are for) you'll need
someone else to step up to the plate. I'll be surf boarding.
Private Declare Function GetTickCount& Lib "kernel32" ()
Dim re(0 To 3) As Object
Dim matches As Object
Dim match As Object
Public Sub ParseAddress()
Dim t As Long
t = GetTickCount
On Error GoTo ParseStreetNumb erErr
InitializeRegul arExpressions
DBEngine(0)(0). Execute "UPDATE Customers SET StreetNumber =
GetStreetNumber (Address)"
Debug.Print GetTickCount - t
ParseStreetNumb erExit:
TerminateRegula rExpressions
Exit Sub
ParseStreetNumb erErr:
MsgBox "Error Number: " & Err.Number & vbNewLine &
Err.Description , vbCritical
Resume ParseStreetNumb erExit
End Sub
Private Sub InitializeRegul arExpressions()
Dim z As Long
For z = 0 To 3
Set re(z) = CreateObject("V BScript.RegExp" )
re(0).Pattern = "\d+"
re(0).Global = True
Next z
End Sub
Private Sub TerminateRegula rExpressions()
Erase re
End Sub
Public Function GetStreetNumber (ByVal vAddress$)
Dim temp$
Dim streetNumber$
Set matches = re(0).Execute(v Address)
For Each match In matches
temp = match.Value
If Len(temp) Len(streetNumbe r) Then _
streetNumber = temp
Next match
If Len(streetNumbe r) 0 Then
GetStreetNumber = CLng(streetNumb er)
Else
GetStreetNumber = Null
End If
End Function
Looks to me as if Lyle went out of his way to code and test something for
you. I'm not anywhere near as familiar with Regular Expressions as he is.
Thus, I think I will just say that Lyle is a highly experienced, very
capable developer in Access and other development environments. I suggest
you carefully review, and try, what he provided.
Larry Linson
Microsoft Access MVP
"SQL Learner" <ex***********@ gmail.comwrote in message
news:11******** **************@ q2g2000cwa.goog legroups.com...
Hi Larry,
I am not using SQL Server as the backend and no network is involved.
I have the tables all in Access. The reason why the database is not
well designed is because I just took the data from csv files and
dumpped them into Access. I did not design the database.
You raised a good print regarding the free form address. We would try
to convert all the "not well structured" data into a better structured
data before we run our update query. For example, we would
standardized all the words used in the addresses by, for example,
convert "E." or "E" to "East" or "Five" to "5".
The objective is to get as much update as we can. The "Left over"
will need to be handled manually.
So given these fact and assume that there will be only two type of
structures: "East 123 ABC Street" and "100 Apple Road", how can I
write UDFs to parse them into
into the following:
Field1 Field2 Field3
-------- --------- ----------------
East 123 ABC Street
100 Apple Road
- Grasshopper -
Not surf boarding if there is such a thing ... I'm afraid of the
surf ... sail boarding or wind surfing.
SQL Learner said:
>So given these fact and assume that there will be only two type of structures: "East 123 ABC Street" and "100 Apple Road", how can I write UDFs to parse them into
into the following:
Field1 Field2 Field3 -------- ------ ---------------- East 123 ABC Street
100 Apple Road
and then Lyle Fairfield said:
>Here's a start in a way I would try.
[suggested a solution using Regular Expressions]
As for the other parts, (they're what re(1) to re(3) are for) you'll need someone else to step up to the plate.
I'll push it ahead a bit further by splitting up the three parts.
(Note that it does not find the number with the most digits as Lyle's
code does, it just finds the first number in the string.)
Sub foo()
' requires reference to:
' Microsoft VBScript Regular Expressions 5.5
' output:
'
' "East","123","A BC Street"
' "","100","A pple Road"
' "","1410"," 33rd Ave NW"
Dim re As RegExp, matches As MatchCollection , match As match
Dim TestValues As Variant, AddrLine As Variant
TestValues = Array( _
"East 123 ABC Street", _
"100 Apple Road", _
"1410 33rd Ave NW")
For Each AddrLine In TestValues
Set re = New RegExp
' late-binding syntax is...
'Set re = CreateObject("V BScript.RegExp" )
re.Pattern = "^(.*?)(\d+)\s+ (.*)$"
Set matches = re.Execute(Addr Line)
If matches.Count = 0 Then
Debug.Print "[no match]"
Else
For Each match In matches
Debug.Print """" & Trim(match.SubM atches(0)) & _
""",""" & Trim(match.SubM atches(1)) & _
""",""" & Trim(match.SubM atches(2)) & _
""""
Next
End If
Set match = Nothing
Set matches = Nothing
Set re = Nothing
Next
End Sub
On Jan 27, 5:58 pm, "Lyle Fairfield" <lylefairfi...@ aim.comwrote:
On Jan 27, 4:33 pm, "SQL Learner" <excelmodel...@ gmail.comwrote:
I am not using SQL Server as the backend and no network is involved.
I have the tables all in Access. The reason why the database is not
well designed is because I just took the data from csv files and
dumpped them into Access. I did not design the database.It's quite likely that you will have to make several passes to
"stroke" your data.
Here's a start in a way I would try. It might not do what is needed.
It might need revision.
It's intended to filter the largest (in characters) numeral in an
address field and to put it into a (type long integer) StreeNumber
field. It's intended to put a null in the field if there is no number
in the address fields, in case some previous effort has made it zero,
or something else that's inappropriate.
For northwinds 830 Customer records this procedure takes 0.01 (one one
hundredth) seconds with my Intel Pntium M 1.5 Processor and 512 meg of
ram. Part of that is taken initializing the Regular expression so we
might expect it to reduce its average time per record as the number of
records increases. But there's no guarantee of anything like that.
Access and VBA and JEt are mysterious beasts and there's no guarantee
that at record 831 there will not be some problem with a cache, or a
disk write or read or whatever and the whole thing will slow to a
crawl.
This is not old proven code. It's new and has been created right now
while I am packing (for that vacation I mentioned). It's very likely
that it can be improved.
If you decide to run it though, please run the whole thing not part of
it. It's unlikely that part of it will behave well. If you are a Reg
Exp/ SQL fiend go right ahead and inporve it. I'll be happy. As for
the other parts, (they're what re(1) to re(3) are for) you'll need
someone else to step up to the plate. I'll be surf boarding.
Private Declare Function GetTickCount& Lib "kernel32" ()
Dim re(0 To 3) As Object
Dim matches As Object
Dim match As Object
Public Sub ParseAddress()
Dim t As Long
t = GetTickCount
On Error GoTo ParseStreetNumb erErr
InitializeRegul arExpressions
DBEngine(0)(0). Execute "UPDATE Customers SET StreetNumber =
GetStreetNumber (Address)"
Debug.Print GetTickCount - t
ParseStreetNumb erExit:
TerminateRegula rExpressions
Exit Sub
ParseStreetNumb erErr:
MsgBox "Error Number: " & Err.Number & vbNewLine &
Err.Description , vbCritical
Resume ParseStreetNumb erExit
End Sub
Private Sub InitializeRegul arExpressions()
Dim z As Long
For z = 0 To 3
Set re(z) = CreateObject("V BScript.RegExp" )
re(0).Pattern = "\d+"
re(0).Global = True
Next z
End Sub
Private Sub TerminateRegula rExpressions()
Erase re
End Sub
Public Function GetStreetNumber (ByVal vAddress$)
Dim temp$
Dim streetNumber$
Set matches = re(0).Execute(v Address)
For Each match In matches
temp = match.Value
If Len(temp) Len(streetNumbe r) Then _
streetNumber = temp
Next match
If Len(streetNumbe r) 0 Then
GetStreetNumber = CLng(streetNumb er)
Else
GetStreetNumber = Null
End If
End Function
Thank you for your code, Lyle!
I tried to use it but the GetStreetNumber function kept returned a
null value and hence, the Update SQL
DBEngine(0)(0). Execute "UPDATE Customers SET StreetNumber =
GetStreetNumber (Address)"
cannot be executed properly.
Also, let's assume the function does return value other than null (or
empty), the SQL statement will only update the records based on that
particular value, but how about others? In addition, do we need a
loop to loop through all the records? May be I am just not getting
your code logic right. Please advice.
- Grasshopper - This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Markku Uttula |
last post by:
I think I'm doing something wrong. I'm able to connect to Oracle just
fine, execute queries and all, but I'm having serious problems with
the speed :(
For example, the following PHP-script on my machine executes about 6
seconds:
<?
$db_conn = ocilogon("my_username", "my_password", "my_database");
$loop_count = 1000;
|
by: Maboroshi |
last post by:
Hi I am fairly new to programming but not as such that I am a total beginner
From what I understand C and C++ are faster languages than Python. Is this
because of Pythons ability to operate on almost any operating system? Or is
there many other reasons why?
I understand there is ansi/iso C and C++ and that ANSI/ISO Code will work on
any system
If this is the reason why, than why don't developers create specific Python
Distrubutions...
|
by: Fabian |
last post by:
Are there any speed issues in javascript with having really large
arrays? I know if the array gets large enough, bandwidth and download
time can be an issue, but does it take inordinate amounts of time to
access a really large array?
--
--
Fabian
Visit my website often and for long periods!
|
by: WindAndWaves |
last post by:
I was wondering if anyone knows what is faster: sql or recordset updates???
And if there are any other differences. At the moment I use docmd.runsql
throughout my database.
---
Please immediately let us know (by phone or return email) if (a) this email
contains a virus
|
by: Neil |
last post by:
I have a situation with an ODBC linked view in an Access 2000 MDB with a SQL
7 back end. The view is scrolling very slowly. However, if I open the view
in an ADP file, it scrolls quickly.
I needed to use an ODBC link for the view because it needs to be editable.
Otherwise, I would have used a pass-through query.
In previous discussions about using an MDB file vs. an ADP file as a front
end for SQL Server, the impression I got was that...
| |
by: Ham |
last post by:
Yeah,
Gotto work with my VB.Net graphic application for days, do any possible type
of code optimization, check for unhandled errors and finally come up with
sth that can't process 2D graphics and photos at an acceptable speed. I have
heard things about the virtual machine of Mr. Net, that it can run my app at
a high speed....but could never compare it with Java VM and its speed. Then,
what should i do? Go and learn C++ ? Do i have time for...
|
by: jphelan |
last post by:
Ever since I successfully applied some techniques for increasing the
speed of my 17 meg. Application; it has only made me hunger for more.
First, let me list what I have done so far:
1. Split the application and database into front and back-ends,
2. Increased the load-time of my application by "pre-loading my
heaviest forms when the database is initially opened,
3. When forms do open, under, "Filter Lookup" I use, "Never",
4. I set...
|
by: tc |
last post by:
Hi. I have a customer who is running our .net application, multiple clients
connecting to an Access database. This ONE customer reports a great speed
degredation when more than one client is connected.
First client logs on and the system runs correctly.
Second client logs on, both connected clients now run very slowly when
retrieving data.
Third client logs on, the speed on all three clients is no degraded even
more.
Etc.
|
by: Arnie |
last post by:
Folks,
We ran into a pretty significant performance penalty when casting floats.
We've identified a code workaround that we wanted to pass along but also was
wondering if others had experience with this and if there is a better
solution.
-jeff
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
| |
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++-12 -std=c++20 -Wnarrowing bit_field.cpp
Here is the code in...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert into image.
Globals.ThisAddIn.Application.ActiveDocument.Select();...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols.
I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |