2012-02-29 2 views
0

У меня есть приложение PHP, которое извлекает информацию о заказе на основе отсканированного/введенного номера заказа для целей заказа. Мы используем Pervasive SQL, но синтаксис идентичен MS SQL.Оптимизация запросов SQL (Pervasive)

У меня есть несколько небольших запросов, используемых для разбивки предметов комплекта на элементы компонентов, которые вызываются по мере необходимости, но они просты и быстры для выполнения. Моя проблема - наш основной запрос, в который вложена самая необходимая информация. Это быстро для большинства заказов, поскольку они относительно небольшие (1-15 предметов или около того). Моя проблема связана с большими заказами (например, с оптовой торговлей), которые могут быть более 100 предметов.

Я понимаю, что чем больше информации понадобилось, тем больше времени потребуется для выполнения запроса, но я надеюсь, что в моем запросе есть место, чтобы оптимизировать его дальше.

Кто-нибудь видит что-либо в следующем запросе, который я могу оптимизировать, чтобы ускорить работу для больших заказов?

SELECT 
    oeordh.orduniq, 
    oeordh.customer, 
    oeordh.ordnumber, 
    oeordh.orddate, 
    oeordh.salesper1, 
    oeordd.orduniq, 
    oeordd.item, 
    oeordd.pickseq, 
    oeordd.location, 
    oeordd.origqty, 
    arcus.idcust, 
    arcus.idgrp 

FROM oeordh 
    INNER JOIN oeordd ON oeordh.orduniq = oeordd.orduniq 
    INNER JOIN arcus ON oeordh.customer = arcus.idcust 

WHERE 
    oeordh.ordnumber = '".$_POST['barcode']."' 

ORDER BY oeordd.pickseq` 
+0

Что скажет вам план запроса (через 'explain')? –

+0

Убедитесь, что у вас есть индексы для всех столбцов соединения, на 'oeordh.ordnumber' и на' oeordd.pickseq'. Остальное зависит от мощности вашей базы данных/сервера. – MicSim

+2

две точки: ** 1. ** похоже, что есть инъекция; пожалуйста, начните использовать подготовленные заявления. ** 2. ** ваше соглашение об именах ужасно –

ответ

1

Вы не можете получить лучше, чем это, убедитесь, что каждое значение вы смотрите на (в том числе объединения) имеют индексы, и что вы не выполняете запрос для каждого элемента, убедитесь, что вы запрашиваете все элементы (которые относятся к текущей странице) одновременно, а затем обрабатывают их на стороне клиента.

В принципе, это не проблема, это либо ваш код, который использует результаты запроса, либо дизайн базы данных (или сеть, но это, скорее всего, не под вашим контролем).

Я чувствую, что я должен упомянуть о явной дыре безопасности в этой строке кода, но я уверен, что вы так много узнаете.

Редактировать: Я действительно думал о чем-то, если эти поля не являются varchar, вы должны rtrim() их на стороне сервера вместо отправки тысяч и тысяч (или более) пробелов в конце каждого столбца.

+0

Я думал, что делать такие вещи, как rtrim в запросе, замедлило запрос? Я также предполагаю, что вы ссылаетесь на бит $ _POST в моем запросе ... Теперь я назначил его переменной, прежде чем запрос будет выполнен. –

+0

Почему они замедляют запрос, вы (надеюсь) обрезаете строку, так или иначе, зачем тратить все эти пространства по сети? И присваивание вещи переменной не решит ничего. – Blindy

+0

Как еще я позабочусь об инъекции? Я запрашиваю на основе значения, прошедшего через форму HTML ... –

1

Возможно, вы не можете стать лучше. Мой профессор в курсе базы данных однажды сказал: «Не пытайтесь быть умным. RDMS хорошо оптимизирует» - кроме одного, RDMS автоматически не устанавливает индексы. Итак, убедитесь, что у вас есть индексы в тех полях, которые вы сортируете, присоединяетесь и выбираете (выбираете, как в предложении «where»).

Смежные вопросы