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

如何以更好的方式编写SQL查询以进行优化?,sql,sql-server,query-optimization,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].[T

当我执行下面的查询时,花了将近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
表有40K条记录

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

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

Where transactions.Time >= '2015-01-01'
  and transactions.Time <  '2015-02-01'
Where transactions.Time>=“2015-01-01”
时间<'2015-02-01'

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

尝试此代码,它可能会对您有所帮助

select  transactionsEntry.StoreID StoreID,items.ItemLookupCode ItemLookupCode,SUM(transactionsEntry.Quantity)
FROM   [HQMatajer].[dbo].[TransactionEntry] transactionsEntry
INNER JOIN [HQMatajer].[dbo].[Item] items ON transactionsEntry.ItemID = items.ID
RIGHT JOIN [HQMatajer].[dbo].[Transaction] transactions ON transactionsEntry.TransactionNumber = transactions.TransactionNumber
Where  transactions.[Time] >= '2015-01-01'   and transactions.[Time] < '2015-02-01'
GROUP BY transactionsEntry.StoreID,items.ItemLookupCode
ORDER BY items.ItemLookupCode
选择transactionsEntry.StoreID StoreID,items.ItemLookupCode ItemLookupCode,总和(transactionsEntry.Quantity)
来自[HQMatajer].[dbo].[TransactionEntry]TransactionEntry
TransactionEntry.ItemID=items.ID上的内部联接[HQMatajer].[dbo].[Item]项目
在TransactionEntry.TransactionNumber=transactions.TransactionNumber上右键联接[HQMatajer].[dbo].[Transaction]事务
其中事务。[Time]>='2015-01-01'和事务。[Time]<'2015-02-01'
按TransactionEntry.StoreID、items.ItemLookupCode分组
ORDER BY items.ItemLookupCode

您需要阻止聚集索引扫描

我建议在[TransactionEntry]上创建覆盖索引:

Key Columns:[TransactionNumber],[ItemID]

Include:[StoreID]
还可以在[Transaction]上尝试此索引:

Key Columns:[time],[TransactionNumber]

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

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

比如说

在事务表中为时间和事务编号创建索引

为TransactionEntry表中的TransactionNumber、ItemID和StoreID创建索引

为项目表中的
项目ID创建索引


请访问此网站

如果你没有,那么给事务添加一个索引。时间。
是什么意思?现在更容易理解了吗?现在它缩短了24秒,结果从3分钟44秒缩短到3分钟20秒查看执行计划并检查花费了这么长的时间。现在你可以看到,我更新了。这一成本占了84%,列名是
autoID
,也是主键。一般提示,不要使用右连接,因为它对大多数人来说太混乱了。切换到左联接,因为更容易理解
主表左联接可选数据
,而不是
可选数据右联接主表
。尝试从事务表中筛选记录,然后与相应的表联接。@ps_prakash02您是对的。现在它减少了一分钟。但是仍然需要2分钟30秒的时间。因为您使用项目内部连接TransactionEntry,正确的事务连接是没有意义的,它实际上是解释和内部连接的。最重要的是,我怀疑TransactionEntry中是否有记录,而TransactionEntry中没有匹配的记录。除了where子句之外,我的查询没有任何区别。这也是已经提出的建议。祝你下次好运time@mohamedfaisal再次检查查询..最好在内部联接之后使用正确的联接。我很困惑。“穆罕默德·费萨尔”正在回答“穆罕默德·费萨尔”的问题?“这是一种制造名声的计划吗?”几年前,当我在埃及时,我遇到了一个名叫穆罕默德的人。他告诉我:“他叔叔的名字叫穆罕默德;他的表弟叫穆罕默德;他的姐夫叫穆罕默德;他父亲的名字也叫穆罕默德;但他母亲的名字——不是穆罕默德”。除此之外,两位穆罕默德都使用了令人怀疑的相似表格提问。尽管考虑到默罕默德似乎不理解默罕默德的答案,可能还有一个更为天真的解释;但确实成功地进行了测试。这个答案提出了一些索引,这些索引可能会有所帮助,但实际上并没有说明“如何更好地编写查询”,而这正是问题实际提出的问题。讽刺的是,如果没有“更好地编写查询”以使其可搜索,第一个索引就无法使用。