【问题标题】:Low performance on concatenation连接性能低下
【发布时间】:2017-01-05 03:42:08
【问题描述】:

我正在使用以下代码来选择我想要的行,但问题是它在从其他表中选择 DocumentNumber 列时性能低,问题出在这部分 ---> ('IN-'+@ItemStatus+ '#'+支票)

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

如果有任何其他解决方案可以提高性能,请告诉我。

【问题讨论】:

  • 我相信这个问题更适合codereview.stackexchange.com
  • 将执行计划添加为xml和可用索引
  • 这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或其他完全不同的东西。
  • 是sql server 2008 r2

标签: sql performance concatenation where


【解决方案1】:

看起来@ItemStatus 是一个标量参数。您可以一次执行这部分操作,而不是对每一行进行比较吗?您将消除许多幕后串联。

set @InItemStatusPound = 'IN-'+@ItemStatus + '#'

ItemFK=(@InItemStatusPound+chequeserial)

这通常是查找表具有基于数值(如 int)而不是字符串值的外键的原因之一。是否对整数而不是需要连接的字符串执行连接选项?

注意:如果您可以保证字符串小于 32 位,那么使用字符串而不是 int 值就可以了。它们的优点是紧凑。

贤者忠告:通常情况下,如果有什么伤害,想办法不去做。

【讨论】:

    猜你喜欢
    • 2019-06-10
    • 1970-01-01
    • 2011-06-15
    • 2011-11-03
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多