Sql server sql server数据库查询速度慢。如何改进

Sql server sql server数据库查询速度慢。如何改进,sql-server,Sql Server,查询的平均完成时间低于21秒。记录表中的行总数为132167 如何加快查询速度 SELECT CONVERT(VARCHAR, dended, 101) AS dt, LEFT(itemid, 3) AS store, Sum(checkamount) AS amountpaid, Sum(finalprice) AS sales FROM records WHERE

查询的平均完成时间低于21秒。记录表中的行总数为132167

如何加快查询速度

SELECT CONVERT(VARCHAR, dended, 101) AS dt,
       LEFT(itemid, 3)               AS store,
       Sum(checkamount)              AS amountpaid,
       Sum(finalprice)               AS sales
FROM   records
WHERE  Dateadd(month, -1, Getdate()) <= dended
       AND highbidder LIKE '%href%'
GROUP  BY CONVERT(VARCHAR, dended, 101),
          LEFT(itemid, 3)
ORDER  BY CONVERT(VARCHAR, dended, 101),
          LEFT(itemid, 3)
我无法共享数据,原因很明显。记录表具有索引

查询速度慢的原因可能涉及很多方面。我主要关心的是改进查询并使其运行更快

数据库在Microsoft SQL Server 2012-11.0.2100.60 X64上运行 构建7601:服务包1


Dateaddmonth,-1,Getdate效果如何?请尝试这种方法-将计算字段移出where和group部分之外:

DECLARE @DateTime DATETIME = DATEADD(MONTH, -1, CURRENT_TIMESTAMP);

SELECT a.dt,a.store,SUM(a.amountpaid) [amountpaid],SUM(a.sales) [sales]
FROM (
    SELECT CONVERT(VARCHAR, r.dended, 101) [dt], 
        LEFT(r.itemid, 3) [store], 
        r.checkamount [amountpaid], 
        r.finalprice [sales],
        CASE WHEN CHARINDEX('href',r.highbidder)>0 THEN 1 ELSE 0 END [IsValid]
    FROM records r
    WHERE r.dended >= @DateTime
) a
WHERE a.IsValid = 1
GROUP BY a.dt,a.store
ORDER BY a.dt,a.store
更新: 如果出于某种原因,在主表上创建非聚集索引受到限制,例如,为了避免更新/插入时性能受到影响,或者如果表的填充因子较低,则在这种情况下,可以将数据复制到临时表,并在临时表上创建索引:

DECLARE @DateTime DATETIME = DATEADD(MONTH, -1, CURRENT_TIMESTAMP);

SELECT r.dended, r.itemid, r.checkamount, r.finalprice, r.highbidder
INTO #Records
FROM records r

CREATE NONCLUSTERED INDEX IDX_TempRecords ON #Records (dended) INCLUDE (itemid, highbidder)

SELECT a.dt,a.store,SUM(a.amountpaid) [amountpaid],SUM(a.sales) [sales]
FROM (
    SELECT CONVERT(VARCHAR, r.dended, 101) [dt], 
        LEFT(r.itemid, 3) [store], 
        r.checkamount [amountpaid], 
        r.finalprice [sales],
        CASE WHEN CHARINDEX('href',r.highbidder)>0 THEN 1 ELSE 0 END [IsValid]
    FROM #Records r
    WHERE r.dended >= @DateTime
) a
WHERE a.IsValid = 1
GROUP BY a.dt,a.store
ORDER BY a.dt,a.store

IF OBJECT_ID('tempdb..#Records') IS NOT NULL BEGIN
    DROP INDEX #Records.IDX_TempRecords
    DROP TABLE #Records
END
如果时间仍然不可接受,您需要重新考虑一般的数据存储方式。为什么它是以这种方式存储的。最好的做法是在记录表上创建额外的列,并将预解析的数据插入表中,以避免以后动态转换。 我指的是额外的栏目:

ALTER TABLE records ADD [dt] VARCHAR(255), [Store] VARCHAR(MAX) and [IsValidHighbidder] BIT

如果您有任何问题,请告诉我。

优化器还注意到dended的索引缺失,这可能会造成很大的差异。如果这个字段没有经常更新,那么创建它就不会有太大的影响

将这些其他列添加为包含字段基本上取决于此查询平均查找多少行=如果这些行不在该字段中,则必须进行多少键查找。如果获取的行数很低,那么将它们添加到索引中也可能是没有意义的


如果有其他类似的查询使用dended作为标准,您可能也应该检查它们,如果其他字段在该索引中有用。

是否有可能更改此字段,例如“%href%”?因为它的开头有%,所以不会使用索引?有多少数据符合条件Dateaddmonth,-1,Getdate也被定义为datetime?我建议将其保留为datetime,并让前端进行格式化。records表的索引中有哪些列?使用CTR-L观察查询计划时,哪个元素的百分比最大?更好的是,发布查询计划。看到您的查询计划中的绿色文本了吗?它建议你创建一个能产生90%差异的索引。您可以右键单击它并获得定义。你的查询也需要重写。索引是“简单的出路”,不应该被滥用,但应该尝试一下。现在是类似的时候吗。或者慢一点,或者更好一点,但还是慢一点?很可能所有进一步的改进都需要重新编制索引。这比当前查询速度非常慢。在得到结果之前,它会运行4分钟以上。当前查询耗时24秒。我将重复我的评论。。。。。在查询计划中看到绿色文本了吗?它建议你创建一个能产生90%差异的索引。您可以右键单击它并获得定义。你的查询也需要重写。索引是“简单的出路”,不应该被滥用,而应该尝试使用它it@VitalyBorisov与之前共享的查询相比,更新后的查询现在运行8秒。我按照nick的建议创建了索引,现在查询运行了3秒钟。我感谢你的建议。谢谢