Оптимизация SQL-запросов (Pervasive) - PullRequest
0 голосов
/ 29 февраля 2012

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

У меня есть пара небольших запросов, используемых для разбиения элементов набора на элементы компонентов, которые вызываются по мере необходимости, но они просты и быстро выполняются. Моя проблема - наш основной запрос, в который вставлена ​​самая необходимая информация. Это быстро для большинства заказов, так как они относительно малы (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`

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

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

1 голос
/ 29 февраля 2012

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

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

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

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

...