Nano Hash - криптовалюты, майнинг, программирование

Мне нужен курсор, как я могу сделать это эффективно без блокировок

У меня есть таблица со списком хранимых процедур.

Я использую курсор, чтобы затем выполнить цикл, вызвать и зафиксировать результат каждой хранимой процедуры (все они возвращают 0 или 1).

Так что я:

DECLARE @PROC_ID INT,
        @PROC_NAME VARCHAR(50)

SELECT *
INTO #MY_PROCS
FROM TABLE_PROCS

DECLARE MY_CURSOR CURSOR FOR
SELECT PROC_ID, PROC_NAME
FROM TABLE_PROCS

OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR INTO @PROC_ID, @PROC_NAME

WHILE @@FETCH_STATUS = 0
BEGIN
  SELECT @PROC_RESULT = .......

  UPDATE #MY_PROCS SET PROC_RESULT = @PROC_RESULT WHERE PROC_ID = @PROC_ID
END

CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR

DROP TABLE #MY_PROCS

Я читал о курсорах и читал, что мне следует установить его как READ ONLY и NO LOCK, если это возможно.

Кроме того, следует ли использовать табличную переменную вместо временной таблицы?

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

13.06.2012

  • Можно ли сделать ЧТО? Вы пропустили важную часть с SELECT @PROC_RESULT - ...... - я не знаю правильного синтаксиса для ...... 13.06.2012
  • ВСЕГДА можно работать без курсора....и в 99,9% случаев предпочтительнее....ИЗБЕГАЙТЕ КУРСОРОВ 13.06.2012
  • без блокировок невозможно — даже WITH (NOLOCK) берет некоторые блокировки (а блокировки являются неотъемлемой частью работы SQL Server — их нельзя просто отключить) 13.06.2012
  • создайте поле идентификации при создании таблицы MY_PROCS и используйте цикл на основе поля идентификации. Не используйте курсор, если вы можете сделать это с помощью цикла while. 13.06.2012
  • @JustinPihony Я согласен с вашим мнением, но курсоров НЕ ВСЕГДА можно избежать (если только вы не считаете, что цикл WHILE или другие базовые циклы, подобные курсорам, не являются курсором). 13.06.2012
  • Я видел кое-что о курсорах и циклах while 13.06.2012
  • @Romil, не могли бы вы объяснить, как здесь поможет столбец идентификаторов в таблице #temp? Я не думаю, что проблема связана с невозможностью зацикливания. 13.06.2012
  • Просто чтобы было понятно, в какой части вы пытаетесь избежать блокировок? Начальный SELECT или в UPDATE? 13.06.2012
  • @ user1361315, теперь проверьте решение без курсора. 13.06.2012
  • @AaronBertrand Да, циклы WHILE избегают использования памяти курсорами. 13.06.2012
  • @JustinPihony Боюсь, вас убаюкали, поверив в миф. ‹пожимание плечами› 13.06.2012
  • @AaronBertrand Вы говорите, что циклы while могут накапливаться в памяти и/или создавать утечку памяти? Кажется, я не могу найти ничего, кроме курсоров, сохраняющих состояние памяти... а не циклов. 13.06.2012
  • @JustinPihony Нет, я утверждаю, что вы можете объявить свои курсоры с гораздо лучшим размером, чем просто DECLARE c CURSOR for..., который поставляется с целым набором ненужных значений по умолчанию, которые обычно не нужны. И ошибочно полагать, что цикл while работает лучше, чем курсор. См. ссылку, опубликованную swasheck. И не стесняйтесь демонстрировать сравнение цикла while и курсора, где цикл while превосходит курсор, делая то же самое. 13.06.2012
  • @AaronBertrand Я согласен, именно память (и возможность утечки памяти) удерживает меня от курсоров. Мне приходилось отслеживать утечки памяти SQL из-за курсоров, и это не весело. 14.06.2012
  • @JustinPihony хорошо, но курсоры похожи на многие другие вещи в мире программирования и в жизни в целом. Если вы используете их правильно, вам не нужно ничего отслеживать, и курсоры — не единственное, чем вы можете злоупотреблять в SQL Server (лично мне никогда не приходилось отслеживать утечку памяти, фактически вызванную курсором, но я могу себе представить, что то, как они используются, определенно может способствовать этому). Я знаю, что на шоссе каждый день происходят автомобильные аварии, но иногда это лучший способ добраться куда-нибудь. 14.06.2012

Ответы:


1

Самый эффективный курсор будет, по крайней мере, во всех моих тестах:

DECLARE MY_CURSOR CURSOR 
  LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR ...

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

13.06.2012

2

Итак, у вас есть две таблицы, одну из которых вы хотите обновить значениями из другой, и они имеют общий ключ. Ну вот:

update [m]
set proc_id = t.proc_id
from #MY_PROCS as [m]
inner join TABLE_PROCS as [t]
   on m.proc_id = t.proc_id
13.06.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..