【问题标题】:retrieve large amount of data from multiple tables within seconds在几秒钟内从多个表中检索大量数据
【发布时间】:2018-02-22 14:53:30
【问题描述】:

以下查询从多个表中检索数据。

有一个问题,随着数据的增加,检索数据的时间也增加了(行数已经达到2万,显示结果需要一分钟多)。

我使用了存储过程,但结果是一样的。有什么解决办法吗?

Select TransactionDate,
    T.InvoiceNo,
    T.TotalAmount,
    PCost.TotalCostPrice ,
    (T.TotalAmount - PCost.TotalCostPrice) as TProfit,
    P.PaidAmount, P.Balance,
    CONCAT(Lastname, ', ', Firstname, ' ', Middlename) as Cashier,
    ISNULL(P.DiscountAmount,0),
    ISNULL(P.ProfitAmount,0),
    CustomerInfo
FROM [Transaction] T 
INNER JOIN TransactionPayment P ON T.InvoiceNo = P.InvoiceNo 
INNER JOIN Employee E ON T.EmployeeID =  E.EmployeeID 
LEFT OUTER JOIN (
                SELECT  SUM(p.CostPrice*tl.Quantity) as TotalCostPrice,
                        tl.InvoiceNo 
                FROM Product p 
                INNER JOIN TransactionLineItem   tl ON p.ProductID = tl.ProductID 
                INNER JOIN [Transaction] T ON T.InvoiceNo = tl.InvoiceNo 
                WHERE TransactionDate >= @DateFrom AND TransactionDate <= @DateTo 
                GROUP BY tl.InvoiceNo
            )   as PCost ON PCost.InvoiceNo = T.InvoiceNo 
WHERE TransactionDate >= @DateFrom AND TransactionDate <= @DateTo

【问题讨论】:

  • 没有显示执行计划,只能猜测如何改进查询。使用任何 ORM 吗?

标签: sql sql-server


【解决方案1】:

试试这个:

create index IX_Transaction_TransactionDate
on dbo.[Transaction] (TransactionDate, InvoiceNo);

【讨论】:

  • 我已经在事务表上创建了索引但是结果是一样的
  • 你的DateFrom和DateTo是局部变量还是存储过程的输入参数?尝试在查询结束时使用 OPTION(RECOMPILE)。仅用于测试目的。
  • 这些是输入参数。
  • 那么你的查询没有足够的选择性来使用索引搜索。你能把你得到的查询计划贴在这里吗:brentozar.com/pastetheplan
猜你喜欢
  • 2021-01-27
  • 2019-07-28
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2017-05-08
  • 2010-11-25
  • 1970-01-01
相关资源
最近更新 更多