如何以更好的方式编写SQL查询以进行优化?

时间:2016-12-28 10:44:09

标签: sql sql-server query-optimization

当我执行以下查询时,花了将近4分钟。

这是查询

SELECT
    transactionsEntry.StoreID StoreID,
    items.ItemLookupCode ItemLookupCode,
    SUM(transactionsEntry.Quantity)
FROM
    [HQMatajer].[dbo].[TransactionEntry] transactionsEntry
RIGHT JOIN 
    [HQMatajer].[dbo].[Transaction] transactions ON transactionsEntry.TransactionNumber = transactions.TransactionNumber
INNER JOIN 
    [HQMatajer].[dbo].[Item] items ON transactionsEntry.ItemID = items.ID
WHERE
    YEAR(transactions.Time) = 2015 
    AND MONTH(transactions.Time) = 1
GROUP BY
    transactionsEntry.StoreID, items.ItemLookupCode
ORDER BY 
    items.ItemLookupCode

TransactionEntry表可能有900亿条记录,Transaction表有300亿条记录,item表有40条记录。

估算成本 for this query。它显示了84%。它是聚集索引。

4 个答案:

答案 0 :(得分:3)

避免函数调用 - 它们阻止使用索引。尝试

Where transactions.Time >= '2015-01-01'
  and transactions.Time <  '2015-02-01'

如果列transactions.Time上没有索引,则为此列添加索引。

答案 1 :(得分:0)

您需要阻止聚集索引扫描。

我建议在[transactionsentry]上创建一个覆盖索引:

Key Columns:[TransactionNumber],[ItemID]

Include:[StoreID]

也可以在[交易]上试用这个索引:

Key Columns:[time],[TransactionNumber]

(抱歉,我无法提供更深入的内容,但我不知道您当前的索引结构)

答案 2 :(得分:0)

为您在查询中使用的所有表创建索引。 这是更快地产生结果的更好方法。

例如

  

Time and TransactionNumber in Transaction Table

创建索引      

TransactionNumber, ItemID and StoreID in TransactionEntry Table

创建索引      

ItemID in Item Table创建索引。

请访问此网站。 You can learn from the basic for query tuning and SQL optimization

答案 3 :(得分:-1)

尝试此代码一旦它可以帮助您

0