Я пытаюсь получить самую высокую производительность для этого запроса 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
)
[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