У меня есть запрос в моей производственной среде, которая требует много времени для выполнения. Я не писал этот запрос, но должен найти способ сделать это быстрее, так как он вызывает большую проблему с производительностью на данный момент. Мне нужно заменить NOT IN на Left Join, но не уверен, как его переписать. Это выглядит следующим образом на данный моментПереписать SQL-запрос - мне нужно заменить NOT IN на Join
SELECT TOP 1 IT.ITEMID
FROM (SELECT CAST(ITEMID AS NUMERIC) + 1 ITEMID
FROM Items
WHERE ISNUMERIC(ITEMID) = 1
AND CAST(ITEMID AS NUMERIC) >= 50000) IT
WHERE IT.ITEMID NOT IN (SELECT CAST(ITEMID AS NUMERIC) ITEMID
FROM Items
WHERE ISNUMERIC(ITEMID) = 1)
ORDER BY IT.ITEMID
Просьба предложить, как я должен переписать его с помощью левой присоединиться к более высокой производительности. Любая помощь/руководство очень ценится.
'НЕ в' к' LEFT JOIN/IS NULL' (или 'NOT EXISTS') не поможет, если у вас есть нет индексов, которые будут использоваться в запросе. –
LEFT JOIN/IS NULL обычно медленнее, чем NOT IN/NOT EXISTS. Как сказал @ypercube, это проблема индекса, которая не поддерживается CAST и fucntions в предикатах, которые в любом случае недействительны для использования индекса. – gbn
Также 'ISNUMERIC (ITEMID) = 1 И CAST (ITEMID AS NUMERIC)> = 50000' не делает того, что вы надеетесь, что это будет сделано, потому что a) нет гарантии на порядок, в котором предикаты оцениваются, и b) просто потому что 'ISNUMERIC' возвращает 1, нет гарантии, что вы можете присвоить значение' NUMERIC'. –