加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

为什么我的SQL Server ORDER BY缓慢,尽管有序列被索引?

发布时间:2020-12-12 07:48:31 所属栏目:MsSql教程 来源:网络整理
导读:我有一个SQL查询(由LINQ to Entities生成),大致如下: SELECT * FROM [mydb].[dbo].[employees]JOIN [mydb].[dbo].[industry] ON jobs.industryId = industry.idJOIN [mydb].[dbo].[state] ON jobs.stateId = state.idJOIN [mydb].[dbo].[positionType] ON jo
我有一个SQL查询(由LINQ to Entities生成),大致如下:
SELECT * FROM [mydb].[dbo].[employees]
JOIN [mydb].[dbo].[industry]
  ON jobs.industryId = industry.id
JOIN [mydb].[dbo].[state]
  ON jobs.stateId = state.id
JOIN [mydb].[dbo].[positionType]
  ON jobs.positionTypeId = positionType.id
JOIN [mydb].[dbo].[payPer]
  ON jobs.salaryPerId = payPer.id
JOIN [mydb].[dbo].[country]
  ON jobs.countryId = country.id
WHERE countryName = 'US'
ORDER BY startDatetime

查询返回大约1200行,我认为这不是很大的数量.不幸的是,也需要?16秒.没有ORDER BY,查询需要< 1秒. 我使用SQL Server Management Studio将一个索引放在startDatetime列上,还有一个在“cityId,industryId,startDatetime,positionTypeId,payPerId,stateId”上的聚集索引(即我们在“作业”中使用的所有列) JOINs和我们使用ORDER BY的列).我已经在JOIN中使用的每个列上都有单独的索引.不幸的是,这并没有使查询更快. 我跑了一个showplan,得到:

|--Nested Loops(Inner Join,OUTER REFERENCES:([mydb].[dbo].[jobs].[cityId]))
       |--Nested Loops(Inner Join,OUTER REFERENCES:([mydb].[dbo].[jobs].[stateId]))
       |    |--Nested Loops(Inner Join,OUTER REFERENCES:([mydb].[dbo].[jobs].[industryId]))
       |    |    |--Nested Loops(Inner Join,OUTER REFERENCES:([mydb].[dbo].[jobs].[positionTypeId]))
       |    |    |    |--Nested Loops(Inner Join,OUTER REFERENCES:([mydb].[dbo].[jobs].[salaryPerId]))
       |    |    |    |    |--Sort(ORDER BY:([mydb].[dbo].[jobs].[issueDatetime] ASC))
       |    |    |    |    |    |--Hash Match(Inner Join,HASH:([mydb].[dbo].[currency].[id])=([mydb].[dbo].[jobs].[salaryCurrencyId]))
       |    |    |    |    |         |--Index Scan(OBJECT:([mydb].[dbo].[currency].[IX_currency]))
       |    |    |    |    |         |--Nested Loops(Inner Join,WHERE:([mydb].[dbo].[jobs].[countryId]=[mydb].[dbo].[country].[id]))
       |    |    |    |    |              |--Index Seek(OBJECT:([mydb].[dbo].[country].[IX_country]),SEEK:([mydb].[dbo].[country].[countryName]='US') ORDERED FORWARD)
       |    |    |    |    |              |--Clustered Index Scan(OBJECT:([mydb].[dbo].[jobs].[PK_jobs]))
       |    |    |    |    |--Clustered Index Seek(OBJECT:([mydb].[dbo].[payPer].[PK_payPer]),SEEK:([mydb].[dbo].[payPer].[id]=[mydb].[dbo].[jobs].[salaryPerId]) ORDERED FORWARD)
       |    |    |    |--Clustered Index Seek(OBJECT:([mydb].[dbo].[positionType].[PK_positionType]),SEEK:([mydb].[dbo].[positionType].[id]=[mydb].[dbo].[jobs].[positionTypeId]) ORDERED FORWARD)
       |    |    |--Clustered Index Seek(OBJECT:([mydb].[dbo].[industry].[PK_industry]),SEEK:([mydb].[dbo].[industry].[id]=[mydb].[dbo].[jobs].[industryId]) ORDERED FORWARD)
       |    |--Clustered Index Seek(OBJECT:([mydb].[dbo].[state].[PK_state]),SEEK:([mydb].[dbo].[state].[id]=[mydb].[dbo].[jobs].[stateId]) ORDERED FORWARD)
       |--Clustered Index Seek(OBJECT:([mydb].[dbo].[city].[PK_city]),SEEK:([mydb].[dbo].[city].[id]=[mydb].[dbo].[jobs].[cityId]) ORDERED FORWARD)

重要的一行似乎是“| –Sort(ORDER BY:([mydb].[dbo].[jobs].[issueDatetime] ASC))” – 没有提到该列的索引.

为什么我的ORDER BY让我的查询慢得多,我如何加快我的查询?

解决方法

如果您的查询不包含订单,那么它将返回所发现的任何异常的数据.当您再次运行查询时,不保证数据甚至以相同的顺序返回.

当您包含order by子句时,dabatase必须以正确的顺序构建行列表,然后以该顺序返回数据.这可能需要大量额外的处理,这可以转化为额外的时间.

排序大量列可能需要更长时间,您的查询可能返回.在某些时候,你将会用尽缓冲区,数据库将不得不开始交换,而且会降低速度.

尝试返回较少的列(指定所需的列而不是Select *),并查看查询运行速度是否更快.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读