Производительность SQL “СУЩЕСТВУЕТ” варианты использования

Для тех, кто не знает, как использовать PDO (исходя из функций mysql_), я сделал очень, очень простую PDO-обертку , которая представляет собой один файл. Он существует, чтобы показать, насколько легко выполнять все обычные приложения, которые необходимо выполнить. Работает с PostgreSQL, MySQL и SQLite.

В основном читайте

, когда вы читаете руководство , чтобы узнать, как использовать функции PDO в реальной жизни, чтобы упростить хранить и извлекать значения в нужном формате.

Мне нужен один столбец

$count = DB::column('SELECT COUNT(*) FROM `user`);

Мне нужны результаты массива (key => value) (т. е. для создания selectbox)

$pairs = DB::pairs('SELECT `id`, `username` FROM `user`);

Мне нужен результат одной строки

$user = DB::row('SELECT * FROM `user` WHERE `id` = ?', array($user_id));

Мне нужен массив результатов

$banned_users = DB::fetch('SELECT * FROM `user` WHERE `banned` = ?', array(TRUE));

24
задан Dustin Laine 8 June 2011 в 17:08
поделиться

6 ответов

Определенно № 1. Это "выглядит" страшным, но поймите, что оптимизатор сделает правильную вещь и выразителен из намерения. Также существует небольшая премия опечатки, должен, тот случайно думать СУЩЕСТВУЕТ, но ввести. № 2 приемлем, но не выразителен. Третья опция воняет в моем не так скромное мнение. Это слишком близко к высказыванию, "если 'никакое значение' не существует" для комфорта.

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

таким образом, оптимизатор будет почти всегда выполнять Ваше сложное колдовство соединения/выбора/группировки для сохранения простого EXISTS/subquery тот же путь.

дав себя престижность для того, чтобы умно переписать это противное ИЛИ из соединения Вы в конечном счете поймете, что оптимизатор все еще использовал тот же дрянной план выполнения для разрешения намного более легкого для понимания запроса со встроенным ИЛИ так или иначе.

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

15
ответ дан Peter Mortensen 28 November 2019 в 22:56
поделиться

В SQL Server, по крайней мере,

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

Все три используют тот же самый план выполнения

, от которого я всегда использую [Выбор *...], поскольку я думаю, что это читает лучше, не подразумевая, что я хочу что-то, в особенности возвратился из подзапроса.

РЕДАКТИРОВАНИЕ: Из dave Коста комментария... Oracle также использует тот же план выполнения относительно всех трех опций

3
ответ дан Charles Bretana 28 November 2019 в 22:56
поделиться

Это - один из тех вопросов, который находится на грани инициирования некоторая священная война.

существует довольно хорошая дискуссия об этом здесь .

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

1
ответ дан inferis 28 November 2019 в 22:56
поделиться

EXISTS возвраты булевская переменная не фактические данные, которые сказали лучшую практику, должны использовать № 3.

1
ответ дан shA.t 28 November 2019 в 22:56
поделиться

План выполнения . Изучите его, используйте его, любите его

нет никакого возможного способа предположить, действительно.

0
ответ дан Thuglife 28 November 2019 в 22:56
поделиться

#3 Должен быть лучшим как Вы, donВґt нужны возвращенные данные так или иначе. Обеспечение полей только добавит дополнительное служебное

-4
ответ дан DonOctavioDelFlores 28 November 2019 в 22:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: