Низкая производительность при объединении
Я использую следующий код для выбора желаемых строк, но проблема в том, что он имеет низкую производительность при выборе DocumentNumber
столбец из другой таблицы, что проблема в этой части ---> ('IN-'+@ItemStatus+'#'+chequeserial)
SELECT
Banking.ReceivedCheque.Date, Banking.ReceivedCheque.StatusDate,
Banking.ReceivedCheque.DueDate, Banking.ReceivedCheque.ChequeSerial,
Banking.ReceivedCheque.BankName Banking.ReceivedCheque.CompanyInfoFK,
Banking.ReceivedCheque.FinancialPeriodFK,
Banking.ReceivedCheque.CreditGFK, Banking.ReceivedCheque.CreditID,
ReceivedFromAccount = dbo.getname(CreditID, CreditGFK, FinancialPeriodFK),
DefBankAccount = dbo.getname(DefaultBankID, '4', FinancialPeriodFK),
Banking.ReceivedCheque.StatusFK,
Banking.ChequeStatus.Title,
(SELECT MAX(DocumentFK)
FROM Accounting.DocumentDetail
WHERE ItemFK = ('IN-' + @ItemStatus + '#' + chequeserial)
AND financialPeriodFK = @FinancialPeriodFK) AS DocumentNumber
FROM
Banking.ReceivedCheque
INNER JOIN
Banking.ChequeStatus ON Banking.ReceivedCheque.StatusFK = Banking.ChequeStatus.ChequeStatusID
WHERE
ReceivedCheque.FinancialPeriodFK = @FinancialPeriodFK
AND Banking.ReceivedCheque.StatusFK = @StatusFK
Пожалуйста, дайте мне знать, если есть другое решение для повышения производительности.
1 ответ
Похоже, @ItemStatus является скалярным параметром. Можете ли вы выполнить эту часть операции один раз, а не для каждой строки сравнения? Вы бы избавились от многих конкатенаций за сценой.
set @InItemStatusPound = 'IN-'+@ItemStatus + '#'
ItemFK=(@InItemStatusPound+chequeserial)
Обычно это одна из причин, по которым таблицы поиска имеют внешние ключи, основанные на числовых значениях, таких как int, а не на строковых значениях. Является ли выполнение соединения целым числом, а не строкой, требующей конкатенации, как вариант?
Примечание. Если вы можете гарантировать, что строка будет менее 32 бит, лучше использовать строки, а не значения int. Их преимущество заключается в их компактности.
Совет мудреца: Как правило, если что-то болит, подумайте, как этого не делать.