通过SQL Server提高SQL查询的性能

时间:2018-02-19 21:05:36

标签: sql sql-server query-optimization

我正在寻找提高去年参加者查询的表现。现在,它花了20多分钟来运行这个区块。

LYA参加特定活动的最近一年,并在最长时间之前找到他们参加的那一年。例如,如果他们在2018年参加了一个活动,那么查询将查找2018年之前参加的最后一年。

2018年的LYA应该返回Null

数据应返回以下内容:

CompanyID   MarketID    Industry    LAST YEAR ATTENDED
-------------------------------------------------------
123456      1234        GIFT        2018
123457      1234        HOME        2017
123458      1234        GIFT        2018
123459      1234        HOME        2018
123460      1234        APPAREL     2018
123461      1234        HOME        2018
123462      1234        HOME        2017
123463      1234        APPAREL     2018

有人可以帮忙吗?

SELECT DISTINCT 
    COMPANYID, MARKETID, INDUSTRY,
    [LAST YEAR ATTENDED] = (SELECT MAX(YEAR(attdate))
                            FROM v_marketatt va
                            WHERE va.companyid = vm.companyid
                              AND YEAR(attdate) <> (SELECT MAX(YEAR(attdate))
                                                    FROM v_marketatt vb
                                                    WHERE vb.companyid = vm.companyid)
                              AND MARKETCODE LIKE 'SM1%')
FROM
    v_marketatt vm
WHERE 
    MARKETID IN (835, 1032, 1101)

更新:

发现版本比其他版本更有效。在克隆上运行时间长达7分钟。不要让子查询两次进入我的视图,而是让它浸入一次。

select
DISTINCT COMPANYID,
MARKETID,
INDUSTRY,
CSTATUS,
[LAST YEAR ATTENDED] = (select max(year(attdate)) from v_marketatt va where year(attdate) <> (select max(year(attdate)) from v_marketatt) AND MARKETCODE LIKE 'SM1%' AND va.COMPANYID = vm.COMPANYID)
from v_marketatt vm
WHERE MARKETID IN (835,1032,1101)
;

感谢所有回复的人。

3 个答案:

答案 0 :(得分:0)

[[LAST YEAR ATENDED]字段有一个子查询,用于计算每次迭代的最大年份。您可以尝试将此查询移动到类似

的连接
    select DISTINCT COMPANYID, MARKETID, INDUSTRY,
    [LAST YEAR ATTENDED] 
    from v_marketatt vm
    inner join 
    ( select max(year(attdate)) as [LAST YEAR ATTENDED]
                    from v_marketatt ivm 
           where year(ivm.attdate) <> (select max(year(attdate))
                                            from v_marketatt vb
                                            where vb.companyid = 
                 ivm.companyid)
       AND MARKETCODE LIKE 'SM1%')va on va.companyid = vm.companyid
          --where companyid not in (select distinct companyid from 
      v_marketatt where marketid in (602))
       WHERE MARKETID IN (835,1032,1101)

我没有运行此查询,可能会对语法进行一些小的修正,但是如果你得到这个概念,它应该很容易选择和修复。

答案 1 :(得分:0)

语法道歉,我快速将它们放在一起。但我怀疑使用CTE可以大大提高性能。我也不太清楚你在这做什么:

WHERE va.companyid = vm.companyid
                              AND YEAR(attdate) <> (SELECT MAX(YEAR(attdate))
                                                    FROM v_marketatt vb)
                              AND MARKETCODE LIKE 'SM1%'

所以我独自离开了那一块。尝试这样的事情,这应该有所帮助,并且可能澄清我上面提到的部分可能解锁其他事情来调整。

;with Year_CTE (year)

as

(SELECT MAX(YEAR(attdate), va.companyid)
                            FROM v_marketatt va
                            WHERE va.companyid = vm.companyid
                              AND YEAR(attdate) <> (SELECT MAX(YEAR(attdate))
                                                    FROM v_marketatt vb)
                              AND MARKETCODE LIKE 'SM1%')

SELECT DISTINCT 
    COMPANYID, MARKETID, INDUSTRY,
    vb.[YEAR]
FROM
    v_marketatt vm
join Year_CTE vb on vb.companyid = vm.companyid
WHERE 
    MARKETID IN (835, 1032, 1101)

答案 2 :(得分:0)

如果您需要“此前的那个”,我建议您使用var popupViewModel = new NetworkNameDescriptorViewModel(_eventAggregator) { DescriptorContext = new DescriptorModel { Hex = obj.Hex, Tag = obj.Tag, Length = obj.Length, Name = obj.Name } }; var popupView =_container.Resolve<NetworkNameDescriptor.NetworkNameDescriptor>(); popupView.DataContext = popupViewModel; Window window = new Window() { Title = "Network name descriptor", Content = popupView }; window.Show(); LEAD()个功能。 虽然我不太确定我完全理解你的例子(参见Thorsten Kettners评论),但按照解释我认为你想要的是:

LAG()

由于我没有这里的表格或数据,我没有测试过这个查询,但我希望它会让你去...