Что такое “безудержный запрос”?

Вы, кажется, вызываете mysqli_stmt :: fetch (), но ожидаете, что он будет действовать как PDOStatement::fetch().

Несмотря на то, что функции имеют одно и то же имя, они имеют разные расширения, и вы не можете смешивать их. Если вы хотите использовать функцию PDO fetch (), вам следует подключиться к базе данных с помощью PDO.

Кроме того, функция mysqli_stmt::fetch() не возвращает строку данных. Он полагается на привязку результатов к переменным .

Я предпочитаю стиль PDO, где PDOStatement::fetch() возвращает строку. Я рекомендую вам конвертировать код для использования PDO повсеместно.

7
задан dance2die 25 February 2009 в 21:32
поделиться

8 ответов

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

9
ответ дан 6 December 2019 в 09:22
поделиться

Это - запрос, который начинает работать и никогда не возвращается (для некоторого значения "никогда").

Обычно это означает, что запрос не использует индекс, это, как предполагается, или использование плохого метода соединения, или плохого порядка соединения или выполнения набора преобразования строк / сравнение.

Возможно записать SQL-запросы, которые занимают недели/годы для выполнения.

4
ответ дан 6 December 2019 в 09:22
поделиться

Я применяю этот термин конкретно к запросу, который инициировал, обычно случайно, поведение со временем выполнения неожиданной сложности. Если Вы ожидаете, что запрос возьмет O (n * m) (то есть, единственное соединение между двумя таблицами), и он берет O (n * n * m) затем, я назвал бы его безудержным, даже если n * n * m является приемлемо маленьким в данном случае. Чаще всего это испытано, поскольку запрос ожидал брать O (журнал (n) * журнал (m)) берущий O (n * n * m * m), который оказывается неприемлемо сложным.

2
ответ дан 6 December 2019 в 09:22
поделиться

Безудержные запросы имеют много характеристик - выбирают некоторых от:

  • они производят гигантские наборы результатов
  • они блокируют много таблиц
  • они приводят к большому количеству записей в журнале транзакций
  • они используют обширный ampounts ресурсов ЦП и ввода-вывода

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

2
ответ дан 6 December 2019 в 09:22
поделиться

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

1
ответ дан 6 December 2019 в 09:22
поделиться

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

Из Википедии: язык делает слишком легким сделать Декартово соединение (присоединяющийся ко всем возможным комбинациям), который приводит к "безудержным" наборам результатов, когда операторы Where вводятся с опечаткой. Декартовы соединения так редко используются на практике, что требование явного ДЕКАРТОВА ключевого слова может быть гарантировано. 1992 SQL представил ключевое слово ПЕРЕКРЕСТНОГО ОБЪЕДИНЕНИЯ, которое позволяет пользователю ясно давать понять, что декартово соединение предназначается, но краткое "соединение запятой" без предиката является все еще приемлемым синтаксисом.

1
ответ дан 6 December 2019 в 09:22
поделиться

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

Общие причины могут быть:

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

"Безудержный" запрос может evenually возвратиться, он просто занял бы слишком много времени или слишком много системных ресурсов для создания этого стоящим.

1
ответ дан 6 December 2019 в 09:22
поделиться

Только, чтобы упомянуть, что безудержный запрос мог произойти, если плохо записанный триггер включен. Триггеры должны смочь обработать мультизапись, вставляет/обновляет или deltes, и некоторые люди, как было известно, сделали это с помощью курсора, а не с помощью основанного на наборе языка. Это могло casue запрос для обновления большого количества записей на беглеца. Недавно смог уменьшить время запроса для большого набора записей, обновляемых из-за 40 минут к 40 секундам путем замены одного такого триггера.

Другие причины включают случайные перекрестные объединения (зафиксированный с отличным), nonsargable, где пункты, использование подзапросов или использовал определенные функции, неправильную индексацию, статистические данные, которые не были обновлены, использование курсоров, недостаточного определения в соединении или где. И вперед и вперед.

0
ответ дан 6 December 2019 в 09:22
поделиться
Другие вопросы по тегам:

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