【发布时间】:2015-11-17 12:41:13
【问题描述】:
我在优化特定 SQL 查询时遇到了很大的问题。它包含多个内部连接,向每个表添加索引根本不会提高性能。
我的查询:
declare @categoryid int = 2;
SELECT [Scanresultebay].Id
, [Scanresultebay].Productebayid
, [Scanresultebay].Price
, [Scanresultebay].Stockamount
, [Scanresultebay].Timestamp
, [Category].Categoryname
, (
SELECT TOP 1 [Scanresultebay].price
FROM [Scanresultebay]
INNER JOIN [Productebay] ON [Productebay].id = .[Scanresultebay].productebayid
INNER JOIN [EbaySeller] on [EbaySeller].id = [ProductEbay].ebaysellerid
WHERE [dbo].[EbaySeller].id = 28
and [ProductEbay].categoryid = @categoryid
ORDER BY [Scanresultebay].Id DESC
) AS 'OurPrice'
FROM [Scanresultebay]
INNER JOIN [Productebay] ON [Productebay].Id = [Scanresultebay].productebayid
INNER JOIN [Category] ON [Category].Id = [Productebay].categoryid
WHERE [Scanresultebay].productebayid in (
SELECT [Scanresultebay].productebayid
FROM [Scanresultebay]
INNER JOIN [ProductEbay] ON [ProductEbay].id = [ScanResultEbay].ProductEbayId
INNER JOIN [Category] ON [Category].Id = ProductEbay.CategoryID
WHERE [ProductEbay].categoryid = @categoryid and [ProductEbay].expired is null
GROUP BY [Scanresultebay].ProductEbayId
)
and [Scanresultebay].Id in (
SELECT max(Id)
FROM [Scanresultebay]
WHERE productebayid = [Scanresultebay].ProductEbayId
and [Scanresultebay].Price <> 0
GROUP BY [Scanresultebay].[ProductEbayId]
);
我的索引(正如 SQL Server 建议的那样):
CREATE NONCLUSTERED INDEX [ind_GetPrice]
ON [dbo].[ScanResultEbay] ([Id],[ProductEbayId]) include ([Stockamount], [Timestamp], [Price])
我需要这个查询来在我网站的仪表板上显示信息。所以我必须用这个查询遍历每个类别(总共 100 个)。这最多持续 30-40 秒,这当然是太多了。
创建视图是个问题,因为我还必须为子查询声明 categoryid 的参数,并且参数不能传递给视图。
所以我的问题:
- 我可以为这个查询创建一个特定的索引,这样它会变得更快(现在需要 0.5 秒)。
- 由于这些子查询,我的查询是否太长(或无效)?
- 我还能做些什么来提高我的表现?
【问题讨论】:
-
首先要看执行计划。我可以给您的一个提示是尝试将
in运算符更改为exists运算符。 -
只是想排除参数嗅探:请在查询末尾添加选项(重新完成)并让我们知道
-
对我来说,这似乎是 CARDINALITY ISSUE.. 如果数据不大,您能否在 TEMP TABLE 中实现您的 2 IN 条件?
-
这里和那里有一个名为
productebayid的字段,没有任何前缀。该字段来自哪个表?还给表起别名:在没有别名的情况下在多个地方使用的查询中使用相同的表可能会由于您的解释与优化器的解释之间的差异而导致意外问题 -
@Paolo 感谢您的编辑,我用正确的表别名更新了它。
标签: sql sql-server indices