Исправить длинный запрос времени выполнения синтаксиса myodbc - PullRequest
0 голосов
/ 28 июля 2010

Я пытаюсь создать один SQL-запрос для Access, который связывает таблицы с подключением myodbc для извлечения данных из Интернета, но время для завершения запроса слишком велико, около пяти минут, поэтому я думаю, что проблема в запросе :

SELECT COUNT([o].[orders_id]) AS howmany_orders, 
       (SELECT SUM([op1].[products_quantity]) FROM orders_total AS ot1, orders AS o1, orders_products AS op1
        WHERE [o1].[date_purchased] >=date()-30 and [o1].[orders_id] = [op1].[orders_id] and [ot1].[orders_id] = [op1].[orders_id] and [ot1].[class]="ot_total" and [o1].[orders_status] = 1 and [op1].[products_id]=[op].[products_id]
        GROUP BY [op1].[products_id]
        ) AS pendiente,
        [op].[products_model], 
        Round((((7+1)*(howmany_orders/90))+1)-(p.stock_real- IIF(pendiente>0,pendiente,0)), 0) AS pedir,
        p.ref_id

FROM orders_total AS ot, orders AS o, orders_products AS op INNER JOIN Productos AS p ON Mid([op].[products_model],4) LIKE p.ref_id

WHERE [o].[date_purchased] >=date()-90 and [o].[orders_id] = [op].[orders_id] and [ot].[orders_id] = [op].[orders_id] and [ot].[class]="ot_total" and [o].[orders_status] IN (7, 1) and ((p.fuera_de_stock)=False) and ((p.suspendido)=False) and  ((p.quitar_de_la_web)=False)

GROUP BY [op].[products_model], p.ref_id, p.stock_real, [op].[products_id];

С первого взгляда я вижу, что одной из проблем может быть оператор " LIKE ":

 INNER JOIN Productos AS p ON Mid([op].[products_model],4) LIKE p.ref_id

но у меня нет способа заменить = оператор

Спасибо за вашу помощь!

РЕДАКТИРОВАНИЕ: Я сократил запрос до этого, но в то же время:

SELECT COUNT(o.orders_id) AS howmany_orders, (
SELECT SUM(opz.products_quantity) FROM orders AS oz, orders_products AS opz WHERE oz.date_purchased >=date()-30 and oz.orders_id = opz.orders_id and oz.orders_status = 1 and opz.products_id=op.products_id GROUP BY opz.products_id
) AS pendiente, op.products_model, Round((((7+1)*(howmany_orders/90))+1)-(p.stock_real-IIf(pendiente>0,pendiente,0)),0) AS pedir, p.ref_id
FROM orders AS o, orders_products AS op INNER JOIN Productos AS p ON op.products_model=p.cod
WHERE o.date_purchased>=date()-90 And o.orders_id=op.orders_id And o.orders_status In (7,1) And ((p.suspendido)=False) And ((p.quitar_de_la_web)=False)
GROUP BY op.products_model, p.ref_id, p.stock_real, op.products_id;

1 Ответ

0 голосов
/ 28 июля 2010

Да, это твоя проблема. База данных не может выполнить объединение с использованием каких-либо индексов, поэтому она должна выполнить сканирование таблицы. Можно ли как-нибудь сохранить эти данные, чтобы вам не приходилось делать оператор MID и просто присоединяться к этому? то есть в вашей таблице products_model есть дополнительный столбец, в котором хранятся MID-данные с объединением в этом столбце

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...