Hola,
También puedes usar with que te permite tener especificar tablas temporales con ciertas condiciones de búsqueda antes de enlazar con las demás. Pasarías de enlazar 10 filas de tabla A con otras 10 filas de tabla B (suponiendo que ambas tablas tienen 10 filas)... a enlazar 5 filas de la tabla A que cumplen cierta condición con 3 filas de la tabla B que también cumplen otras condiciones.
Por ejemplo:
WITH Sales_CTE (SalesPersonID, TotalSales, SalesYear)
AS
-- Define the first CTE query.
(
SELECT SalesPersonID, SUM(TotalDue) AS TotalSales, YEAR(OrderDate) AS SalesYear
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL
GROUP BY SalesPersonID, YEAR(OrderDate)
)
, -- Use a comma to separate multiple CTE definitions.
-- Define the second CTE query, which returns sales quota data by year for each sales person.
Sales_Quota_CTE (BusinessEntityID, SalesQuota, SalesQuotaYear)
AS
(
SELECT BusinessEntityID, SUM(SalesQuota)AS SalesQuota, YEAR(QuotaDate) AS SalesQuotaYear
FROM Sales.SalesPersonQuotaHistory
GROUP BY BusinessEntityID, YEAR(QuotaDate)
)
-- Define the outer query by referencing columns from both CTEs.
SELECT SalesPersonID
, SalesYear
, FORMAT(TotalSales,'C','en-us') AS TotalSales
, SalesQuotaYear
, FORMAT (SalesQuota,'C','en-us') AS SalesQuota
, FORMAT (TotalSales -SalesQuota, 'C','en-us') AS Amt_Above_or_Below_Quota
FROM Sales_CTE
JOIN Sales_Quota_CTE ON Sales_Quota_CTE.BusinessEntityID = Sales_CTE.SalesPersonID
AND Sales_CTE.SalesYear = Sales_Quota_CTE.SalesQuotaYear
ORDER BY SalesPersonID, SalesYear;
GO
Obtenido de
https://msdn.microsoft.com/es-ve/library/ms175972.aspx.
De igual manera y como lo indican en las respuestas anteriores los índices, usados correctamente, son de extrema importancia en las base de datos con grandes cantidades de registros. Busca cuáles son las condiciones de búsqueda que siempre usas y crea un índice de ellas.
Por otra parte veo que usas concat y no concatenas nada en realidad eso te resta velocidad ya que llevas a cabo la operación sobre cada registro sin necesidad y además de ello tienes el uso del LIKE que también trabaja bastante lento.
Te recomiendo algo, si en verdad tienes que concatenar, por ejemplo concat(medicamento.medicamento, medicamento.casilla) y ésa búsqueda es sumamente repetitiva o puesto de otra manera se lleva a cabo muchas, muchas veces... entonces puedes crear un índice de la misma, así el manejador no tiene que llevar a cabo la instrucción "concat(medicamento.medicamento, medicamento.casilla)" sobre todas las filas cada vez que alguien genere ésa consulta sino que se va al índice y ya.
Otra recomendación (se me ocurrió pero no se que tan buena es) es crear un select en el que encuentres primero el producto, en éste caso la medicina, y luego llevas a cabo varios subselects, se me ocurre que de ésta manera no enlazas tantas tablas y puede generarse más rápido la salida, algo como:
SELECT medicamento.id_med, medicamento.medicamento, medicamento.casilla, medicamento.stockTotal,
(SELECT lote.id_lote FROM lote WHERE lote.id_med = medicamento.id_med),
(SELECT lote.stock FROM lote WHERE lote.id_med = medicamento.id_med),
(SELECT proveedores.id_lin FROM proveedores WHERE proveedores.id_lote = lote.id_lote)
.
.
.
.
FROM medicamento
WHERE CONCAT(medicamento.medicamento, medicamento.casilla) LIKE '%"+valor+"%' GROUP BY medicamento
De ésta manera, creeeeeo, el manejador llevará a cabo la consulta principal (el select con la condición where) y luego llevará a cabo las subconsultas para buscar las demás columnas.
Espero te sirva.