2014-12-04 3 views
0

Хранимая процедура, которую я создал, работает, но есть ли более эффективный способ сделать это? Чтобы быть справедливым, нет ни одного удара по производительности для любого из этого, и он не нуждается в оптимизации, но я хотел бы знать в интересах правильного ведения дел.Обновление хранимой процедуры Обновление и выбор

государства План выполнения query 1: 17%, query 2: 67%, query 3: 16%

DECLARE @CurrentVoucherID int; 

SET @CurrentVoucherID = 
    (
     SELECT TOP(1) IdGiftVoucherPhysicalCode 
     from GiftVoucherPhysicalCodes 
     WHERE Activated = 0 and assigned = 0 and Value = 10 
     ORDER BY IdGiftVoucherPhysicalCode 
    ); 

UPDATE GiftVoucherPhysicalCodes 
SET Activated = 1, Activated_at = GETDATE() 
WHERE IdGiftVoucherPhysicalCode = @CurrentVoucherID; 

SELECT * FROM GiftVoucherPhysicalCodes 
WHERE IdGiftVoucherPhysicalCode = @CurrentVoucherID; 
+2

Я не вижу ничего плохого в этом, хотел бы сделать это так же, как ... – Hatsjoem

+0

Спасибо, мне кажется, что выбор в настоящее время запуска в два раза чтобы возвратить ту же самую запись, хотя какая-то ошибка меня. – GJKH

+1

Но в плане выполнения не учитывается индекс, находящийся в памяти. Если IdGiftVoucherPhysicalCode индексируется, то последний, где находится тривиальный поиск индекса. – Paparazzi

ответ

0

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

UPDATE GiftVoucherPhysicalCodes 
SET Activated = 1, Activated_at = GETDATE() 
WHERE Activated = 0 and assigned = 0 and Value = 10 
+0

Я обновляю одну конкретную запись за раз, мне нужно получить следующую последовательную доступную запись, которая не была активирована. – GJKH

+1

Итак, вы не можете обновить все записи, которые не были активированы, вам нужно сделать это последовательно? – iddqd

0

вы можете сделать это без переменной

UPDATE GiftVoucherPhysicalCodes 
SET Activated = 1, Activated_at = GETDATE() 
WHERE IdGiftVoucherPhysicalCode = (SELECT TOP(1) IdGiftVoucherPhysicalCode 
          from GiftVoucherPhysicalCodes 
          WHERE Activated = 0 and assigned = 0 and Value = 10 
          ORDER BY IdGiftVoucherPhysicalCode) 

SELECT * FROM GiftVoucherPhysicalCodes 
WHERE IdGiftVoucherPhysicalCode = (SELECT TOP(1) IdGiftVoucherPhysicalCode 
          from GiftVoucherPhysicalCodes 
          WHERE Activated = 1 and assigned = 0 and Value = 10 
          ORDER BY IdGiftVoucherPhysicalCode) 
+0

В вашем предположении второй оператор select не возвращает желаемую запись, потому что вы уже обновили запись, чтобы установить 'activated' в' true'. Вы не могли бы изменить его на активированный, так как он все равно захватил бы неправильную запись, если бы это был первый запрос, который когда-либо выполнялся. – GJKH

Смежные вопросы