当我执行以下查询时,花了将近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条记录。
答案 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