я переменная, объявленная как этотT-SQL - условие, где производительность
DECLARE @Customer_No VARCHAR(MAX)
SET @Customer_No = 'Z110073574;Z110027464;Z110229752;Z110274156;Z110170566;Z110102837;Z110074199'
запрос содержит условию
WHERE ((@Customer_No = '') OR ([Customer No_] IN (SELECT [No_] FROM Customer)))
Если переменная @Customer_No может содержит пустое значение (''), фильтрация должна пропустить. Если переменная содержит клиентов, разделенных точкой с запятой, строка анализируется в таблице Customer и запрос фильтруется значениями в таблице Customer.
Запрос занимает 15 минут. Если я использую только второе условие, это занимает около 50 секунд.
WHERE [Customer No_] IN (SELECT [No_] FROM Customer)
Я не понимаю. Как это возможно? Любое решение? Объяснение? Спасибо.
Edit: Запрос
SELECT DET.[Cust_ Ledger Entry No_]
, DET.[Amount]
, DET.[Entry Type]
, CLE.[Document No_]
FROM [dbo].[Company$Cust_ Ledger Entry] CLE
LEFT JOIN [dbo].[Company$Detailed Cust_ Ledg_ Entry] DET ON CLE.[Entry No_] = DET.[Cust_ Ledger Entry No_]
WHERE ((@Customer_No = '') OR (DET.[Customer No_] IN (SELECT [No_] FROM Customer)))
AND (DET.[Entry Type] = 1 OR DET.[Entry Type] = 2)
AND (CLE.[Due Date] >= @FromDueDate AND CLE.[Due Date] <= @ToDueDate)
AND CLE.[Posting Date] <= @ToDate
Является ли это хранимая процедура ?, сколько строк в вашей таблице ?. Можете ли вы показать планы выполнения? – Lamak
Кроме того, кто называет ваши столбцы? Я хотел бы представить свои запястья своему правителю. –
Вам действительно нужен VARCHAR (макс.) – Sparky