Эффективность запросов PHP и SQL для * или определенных столбцов

0

У меня есть представление базы данных Oracle, в котором у меня есть доступ к 17 столбцам и примерно 15 тыс. Строк (это растет со скоростью около 700 строк в год). Мне нужно использовать только 10 столбцов. На данный момент я ищу способы сделать мой запрос более эффективным, так как мое приложение загружает около 7,5 тыс. Записей в начале. Я знаю, что могу только загрузить, скажем, 1k записей, и это будет способ ускорить процесс загрузки; однако пользователям часто приходится запрашивать более чем 1k записей, загруженных изначально, и я не хочу, чтобы они дождались второй загрузки данных в приложение.

Поэтому я предполагаю, что мой главный вопрос заключается в том, что когда я запрашиваю представление Oracle, я должен запрашивать и просто делать * запрос в базе данных или выбирать определенные столбцы? Я знаю, что лучшие практики указывают только на запросы столбцов, которые вам нужны; однако, я смотрю на это с точки зрения производительности и могу ли я увидеть значительное увеличение производительности, запросив только 10 конкретных столбцов, которые мне нужны, а не * запрос на просмотр?

  • 0
    Можете ли вы предоставить примеры кода? Это сделало бы это намного легче для тех из нас, кто является визуальными мыслителями. Я не могу придумать причину, по которой более конкретный запрос сделает запрос менее производительным ...
  • 0
    Я не эксперт, но думаю об этом так: каждый символ занимает 2-3 байта. Суммирует довольно быстро, не так ли? Это не то же самое количество, что говорят при загрузке изображений, но (в среднем) 64 байта x 17 x 15k. Складывает! Чтобы вычислить это, нужно сделать запрос для ВСЕГО и добавить 1 для каждого числа ASCII, например: space = 042
Показать ещё 2 комментария
Теги:
performance

1 ответ

2

Как говорит @AndyLester, единственный способ узнать наверняка - попробовать и посмотреть. Есть основания ожидать, что указание фактического набора столбцов, в котором вы нуждаетесь, будет быстрее. Вопрос в том, будет ли разница "значимой", что-то, что вы только можете нам рассказать.

Есть несколько причин ожидать улучшения производительности

  1. Указание фактического набора столбцов уменьшает объем данных, которые должны быть переданы по сети, и уменьшает объем памяти, который потребляется на клиенте. Независимо от того, является ли это значительным или нет, зависит от относительного размера столбцов, которые вы выбираете, и от столбцов, которые вы исключаете. Если вам нужна только группа varchar2(10) а столбцы, которые вам не нужны, включают некоторые varchar2(1000), вы можете устранить подавляющую часть вашего сетевого трафика и RAM, потребляемую на клиенте. Если вы исключаете несколько столбцов char(1) когда вы выбираете clob столбцов, сокращение может быть тривиальным.
  2. Указание фактического набора столбцов может привести к более эффективному планированию. В зависимости от версии Oracle, определения представления и определения базовых таблиц возможно, что некоторые из соединений могут быть устранены при выборе поднабора столбцов. Это, в свою очередь, может дать гораздо более эффективный план.
  3. Указание фактического набора столбцов означает, что производительность вашего приложения гораздо менее вероятна, если к представлению добавятся дополнительные столбцы. Ваш код не будет внезапно начинать вытягивать эти новые данные по сети в структуры памяти на клиенте. Возможно, нет необходимости присоединяться к дополнительным таблицам, на которые можно ссылаться.

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

  • 1
    Вместе с этим ответом я бы сказал, что лучше указывать столбцы, чтобы вы точно знали, какие столбцы будут возвращены в ваш код. Это особенно верно, если вы ссылаетесь на столбцы по их индексу в строке. Однако это больше зависит от того, как вы обрабатываете логику доступа к данным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню