Professional Documents
Culture Documents
Artículo : Q172199
Visual Basic nos permite recuperar datos de bases de datos Jet (ficheros MDB) usando
Structured Query Language (SQL). Estas operaciones pueden ser más eficientes
siguiendo algunas de las pautas que veremos a continuación.
Este artículo asume que estamos empleando Jet. Si usamos ODBC muchos de estos
puntos pueden seguir aplicándose. Para más información consulta la las siguientes
palabras en la Microsoft Knowledge Base:
Analizador de rendimiento
Si tienes Access 95 o 97 puedes emplear el Analizador de Rendimiento (Herramientas|
Analizar|Rendimiento) que nos aconsejará si debemos hacer algún cambio en las
consultas.
Cuando la base de datos crese se fragmenta. Al compactar se escriben todos los datos
de cada tabla en páginas contiguas del disco duro, aumentando el rendimiento de las
búsquedas secuenciales.
Para compactar la base de datos debemos emplear la instrucción CompactDatabase.
Este ejemplo compacta la base de datos y hace un backup:
Si la base de datos se modifica mucho habría que pensar en compactarla todos los
días.
DB.CreateQueryDef("Query1", _
"SELECT IIF(Au_ID=1,'Hello','Goodbye') AS X, Au_ID, FROM Authors")
Set RS = DB.OpenRecordSet("SELECT * FROM Query1 WHERE Au_ID=1")
NOTA: Esta consulta es menos eficiente porque la función SUM se hace sobre la tabla
Ord y la cláusula GROUP BY sobre la tabla Cust:
SELECT Cust.CustID,
FIRST(Cust.CustName) AS CustName,
SUM(Ord.Price) AS Total
FROM Cust INNER JOIN Ord ON Cust.CustID = Ord.CustID
GROUP BY Cust.CustID
SELECT Ord.CustID,
FIRST(Cust.CustName) AS CustName,
SUM(Ord.Price) AS Total
FROM Cust INNER JOIN Ord ON Cust.CustID = Ord.CustID
GROUP BY Ord.CustID
Menos eficiente:
SELECT Cust.CustID,
Cust.CustName,
Cust.Phone,
SUM(Ord.Price) AS Total
FROM Cust INNER JOIN Ord ON Cust.CustID = Ord.CustID
GROUP BY Cust.CustID, Cust.CustName, Cust.Phone
Más eficiente:
SELECT Ord.CustID,
FIRST(Cust.CustName) AS CustName,
FIRST(Cust.Phone) AS Phone,
SUM(Ord.Price) AS Total
FROM Cust INNER JOIN Ord ON Cust.CustID = Ord.CustID
GROUP BY Ord.CustID
Menos eficiente:
SELECT Ord.CustID,
FIRST(Cust.CustName) AS CustName,
FIRST(Cust.Phone) AS Phone,
SUM(Ord.Price) AS Total
FROM Cust INNER JOIN Ord ON Cust.CustID = Ord.CustID
GROUP BY Ord.CustID
Más eficiente:
Query1:
SELECT CustID, SUM(Price) AS Total
FROM Ord
GROUP BY CustID
Query2:
SELECT Query1.CustID, Cust.CustName, Cust.Phone, Query1.Total
FROM Cust INNER JOIN Ord ON Cust.CustID = Ord.CustID
Consulta la sección de REFERENCIAS que hay al final de este artículo para encontrar
información más específica.
Like "Smith"
Like "Sm*"
Like "*sen"
Like "*sen*"
Si usas condiciones para retringir los valores en un campo que empleas para una join,
prueba a poner las condiciones para el campo de cada una de las tablas que usas en la
join porque puede haber grandes diferencias de rendimiento.
Menos eficiente:
SELECT Customers.*
FROM Customers
WHERE Customers.[Customer ID]
NOT IN (SELECT [Customer ID] FROM Orders);
Más eficiente:
SELECT Customers.*
FROM Customers LEFT JOIN Orders
ON Customers.[Customer ID] = Orders.[Customer ID]
WHERE ((Orders.[Customer ID] Is Null));
REFERENCIAS
Para más información acerca de cómo optimizar las consultas con la tecnología
Rushmore:
En la ayuda del Microsoft Visual Basic 4.0, busca "Rushmore technology", then:
In Visual Basic 5.0 Books Online, search for "Rushmore Technology", then:
"Optimizing Queries"
For more information about creating queries in code, please see the following articles
in the Microsoft Knowledge Base:
ARTICLE-ID: Q117544
TITLE : INF: Query by Form (QBF) Using Dynamic QueryDef (2.0)
ARTICLE-ID: Q136062
TITLE : INF: Query by Form (QBF) Using Dynamic QueryDef (7.0/97)