Запрос курсора SQL или два отдельных запроса: что будет более эффективным? - PullRequest
0 голосов
/ 22 марта 2011

Я работаю над тем, чтобы сделать немного кода, работающего с деревом сообщений в PHP, более эффективным.Данные хранятся в базе данных SQL, и в настоящее время для каждого сообщения приходится выполнять 2 запроса SQL: один для поиска данных и один для обновления данных.Я думаю, что у меня есть способ сделать это с помощью одного запроса, но он использует курсоры, которые, как я слышал, гораздо медленнее, чем другие методы SQL.

Кто-нибудь знает, будет ли еще эффективнее выполнять один SQL-запрос, использующий курсоры, или лучше придерживаться текущего метода, который использует запросы select и update для каждого сообщения и PHP для связывания?запросы вместе?

1 Ответ

3 голосов
/ 22 марта 2011

Согласитесь с @Catcall - не видя код, сложно ответить на этот вопрос осмысленно.

Однако, в общих чертах, люди часто говорят, что курсоры медленнее, чем другие методы SQL, в том, что некоторые разработчики используют курсоры, где будет работать операция на основе множеств.

Например, если ваш план (в псевдокоде, при отсутствии фактического механизма БД или схемы)

create cursor RecordsToUpdate
as
select *
from UserTable
where name like 'Codd%'

foreachRecord in RecordsToUpdate
  set record.lastUpdatedDate = today
next

Очевидно (надеюсь), что вы можете достичь того же, выполнив

update UserTable
set lastUpdatedDate = today
where name like 'Codd%'

Однако есть случаи, когда операции на основе множеств просто невозможны, и затем - опять же, в широком смысле - будет эффективнее создать курсор, выполнить логику и закрыть курсор - в идеале в пределах сохраненного процедура или что-то. Этот подход ограничивает сетевые накладные расходы при отправке данных обратно на ваш PHP-сервер.

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

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