Как уже было сказано, база данных оптимизирована для заданных операций. Буквально инженеры сели и отлаживали/настраивали эту базу данных в течение длительных периодов времени. Шансы вы оптимизировать их довольно тонкие. Есть всевозможные забавные трюки, с которыми вы можете играть, если у вас есть набор данных для работы с такими дисками, как чтение/запись на диске, кеширование, многопоточность. Кроме того, некоторые операции имеют высокие накладные расходы, но если вы делаете это с совокупностью данных сразу, стоимость одной части данных низкая. Если вы работаете только по одной строке за раз, многие из этих методов и операций просто не могут произойти.
Например, просто посмотрите, как соединяется база данных. Изучая планы объяснения, вы можете увидеть несколько способов объединения. Скорее всего, с помощью курсора вы начинаете строку за строкой в одной таблице, а затем выбираете значения, которые вам нужны из другой таблицы. В принципе, это как вложенный цикл только без герметичности цикла (который, скорее всего, скомпилирован в машинный язык и супер оптимизирован). SQL Server сам по себе имеет целую кучу способов объединения. Если строки отсортированы, он будет использовать некоторый тип алгоритма слияния, если одна таблица мала, она может превратить одну таблицу в таблицу поиска хэша и выполнить соединение, выполнив поиск O (1) из одной таблицы в таблицу поиска. Существует несколько стратегий объединения, которые многие СУБД будут бить, когда вы просматриваете значения из одной таблицы в курсоре.
Просто взгляните на пример создания таблицы поиска хэша. Чтобы построить таблицу, возможно, m операций, если вы соединяете две таблицы одной длиной n и длиной m, где m - меньшая таблица. Каждый поиск должен быть постоянным, так что это n операций. поэтому в основном эффективность хэш-соединения составляет около m (setup) + n (поиск). Если вы делаете это самостоятельно и не предполагаете никаких поисков/индексов, то для каждой из n строк вам нужно будет искать m записей (в среднем это соответствует m/2 поискам).Таким образом, в основном уровень операций идет от m + n (соединяется с группой записей одновременно) до m * n/2 (выполняется поиск через курсор). Также операции упрощения. В зависимости от типа курсора выборка каждой строки курсора может быть такой же, как и для другого выбора из первой таблицы.
Замки также убивают вас. Если у вас есть курсоры на столе, вы блокируете строки (на SQL-сервере это менее строго для статических и forward_only курсоров ... но большинство кода курсора, который я вижу, просто открывает курсор, не указав ни одну из этих опций). Если вы выполняете операцию в наборе, строки все равно будут заблокированы, но в течение меньшего времени. Также оптимизатор может видеть, что вы делаете, и он может решить, что более эффективно блокировать всю таблицу вместо нескольких строк или страниц. Но если вы идете по строкам, оптимизатор понятия не имеет.
Другое дело, что я слышал, что в случае с Oracle это супер оптимизировано для операций курсора, так что он практически не отличается от того же штрафа за операции с набором по сравнению с курсорами в Oracle, как и в SQL Server. Я не эксперт Oracle, поэтому не могу сказать точно. Но более одного человека Oracle сказал мне, что курсоры более эффективны в Oracle. Поэтому, если вы пожертвовали своим первенцем для Oracle, вам, возможно, не придется беспокоиться о курсорах, проконсультируйтесь с местным высокооплачиваемым Oracle DBA :)
'UPDATE Клиент SET AreaCode = AreaCode_Exchange.AreaCode FROM Customer РЕГИСТРИРУЙТЕСЬ AreaCode_Exchange НА ЛЕВЫЙ (Customer.PhoneNumber, 3) = AreaCode_Exchange.Exchange WHERE Customer.AreaCode IS NULL», Вы можете объяснить этот 'ЛЕВЫЙ (Customer.PhoneNumber, 3) 'и его функциональность – Smart003