2013-04-19 2 views
4

Я пытаюсь получить самую высокую производительность для этого запроса DELETE (и SELECT). Есть ли лучший способ УДАЛИТЬ записи, потому что для этого требуется более 10 минут? Я предполагаю, что он должен делать свой собственный вид и сливаться, пока не найдет записи.Самая быстрая производительность с логикой DELETE NOT IN inested query

SELECT COUNT([VISIT_ID]) 
FROM [dbo].[I2B2_SRC_VISITS] 
WHERE [PATIENT_ID] NOT IN (
    SELECT [PATIENT_ID] FROM [dbo].[I2B2_SRC_PATIENT] 
) 

DELETE FROM [dbo].[I2B2_SRC_VISITS] 
WHERE [PATIENT_ID] NOT IN (
    SELECT [PATIENT_ID] FROM [dbo].[I2B2_SRC_PATIENT] 
) 

EDIT: я не мог поставить УДАЛИТЬ перед этим запросом, как я сделал с SELECT. Но это был конечный результат для оператора DELETE.

DELETE FROM [dbo].[I2B2_SRC_VISITS] 
WHERE [VISIT_ID] IN 
(
    SELECT a.[VISIT_ID] 
    FROM [dbo].[I2B2_SRC_VISITS] a 
      LEFT JOIN [dbo].[I2B2_SRC_PATIENT] b 
       ON a.[PATIENT_ID] = b.[PATIENT_ID] 
    WHERE b.[PATIENT_ID] IS NULL 
) 
+0

[ExplainExtended] (http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/) [ BlogSQLAuthority] (http://blog.sqlauthority.com/2008/04/22/sql-server-better-performance-left-join-or-not-in/) и многие другие онлайн-материалы будут направлять вас в направлении НЕ IN/НЕ СУЩЕСТВУЕТ, как вы уже писали. Однако всегда есть исключения, например, когда у вас нет необходимых индексов (которые иногда могут быть действительными). Всегда старайтесь так много форм, как вы знаете, и используйте то, что хорошо работает. Однако для небольших наборов данных это, вероятно, не имеет значения. – RichardTheKiwi

ответ

3

как насчет этого через JOIN?

DELETE a 
FROM [dbo].[I2B2_SRC_VISITS] a 
     LEFT JOIN [dbo].[I2B2_SRC_PATIENT] b 
      ON a.[PATIENT_ID] = b.[PATIENT_ID] 
WHERE b.[PATIENT_ID] IS NULL 

Убедитесь, что колонка [PATIENT_ID] из обеих таблиц имеет ключ определить на них, что делает его более быстрым.


Право. NOT EXIST лучше один.

DELETE a 
FROM [dbo].[I2B2_SRC_VISITS] a 
WHERE NOT EXISTS 
     ( 
      SELECT 1 
      FROM [dbo].[I2B2_SRC_PATIENT] b 
      WHERE a.[PATIENT_ID] = b.[PATIENT_ID] 
     ) 
+0

Можете ли вы объяснить, почему это было бы быстрее, чем НЕ В? Я бы ожидал альтернативы NOT EXISTS, которая постоянно проверяется как наиболее эффективный вариант и/или предложения по соответствующим индексам (без которых решение не будет быстрым). –

+0

WOW, ВСЕ ВРЕМЯ ЗАПИСИ! 21 СЕКУНДЫ! СПАСИБО! – MacGyver

+0

FYI, у меня нет индекса в этой таблице, но, возможно, я мог бы проверить с индексом позже – MacGyver

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