У меня есть очень большая таблица с более чем 10 миллионами записей. Я хочу найти дубликаты на основе совпадения некоторых полей и несоответствия некоторых полей в нем.
В настоящее время я использую запрос ниже:
SELECT DISTINCT MainTable.[lineitemid]
FROM [dbo].[lineitem] MainTable
INNER JOIN [dbo].[lineitem] AS ChildTable
ON ChildTable.invoicedate = MainTable.invoicedate
AND LEFT(ChildTable.vendorname, 4) = LEFT(MainTable.vendorname, 4)
AND ChildTable.invoiceid <> MainTable.invoiceid AND -- Invoice ID column not matching
ChildTable.documentcurrencyamount = MainTable.documentcurrencyamount
WHERE ChildTable.lineitemid <> MainTable.lineitemid AND -- LineItemId is PK
MainTable.projectid = 1125 AND ChildTable.projectid = 1125 -- Duplicates should be identified with specific ProjectId
Этот запрос работает нормально, если количество записей для ProjectId меньше 100 000. Когда записей ProjectId больше 1 миллиона, при выполнении этого запроса размер базы данных tempdb увеличивается до 100 ГБ, что вызывает проблемы с нехваткой места на диске. Запрос выполняется навсегда.
Помогите, пожалуйста, оптимизировать запрос.
Добавлены следующие строки после получения ответа на приведенный выше запрос....
Большое спасибо, @Gordon-Linoff. Предложенный вами запрос работал намного быстрее. VendorName из другой таблицы. Могу ли я включить внутреннее соединение, как показано ниже?
SELECT li1.[LineItemId]
FROM [dbo].[LineItem] li1
INNER JOIN VendorMaster vm1 ON li1.VendorNumber=vm1.VendorNumber
AND vm1.CompanyCode = li1.CompanyCode
WHERE EXISTS (SELECT 1
FROM [dbo].[LineItem] as li2
INNER JOIN VendorMaster vm2 on li2.VendorNumber = vm2.VendorNumber
AND vm2.CompanyCode = li2.CompanyCode
WHERE li2.InvoiceDate = li.InvoiceDate and
LEFT(li2.VendorName, 4) = LEFT(li1.VendorName, 4) and
li2.InvoiceId <> li1.InvoiceId and -- Invoice ID column not matching
li2.DocumentCurrencyAmount = li1.DocumentCurrencyAmount and
li2.LineItemId <> li1.LineItemId and
li2.ProjectId = li1.ProjectId
li2.VendorNumber = li.VendorNumber)
AND li.ProjectId = 1125
Это эффективный подход?