同一个sql查询效率不一样

aswangod 2018-06-20 02:57:28
,如图所示,两个查询差不多,前一个不到1秒可完成,后一个查询需要2分钟,数据在同一个数据库,同一台机子,同一个表中,用网上教的方法,分析了下查询方法,不知道如何解决了,请教高手,江湖救急
注:表未建立任何索引,表数据约30G,不考虑做分区表
...全文
537 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-08-29
  • 打赏
  • 举报
回复
引用 12 楼 aswangod 的回复:
一样的快!但是用最初的查询就是很慢,奇怪的问题


一点都不奇怪。
虽然都是 top 1 , 但毕竟不用 top 1 时, 总数相差太大。
有时 top 1 也无法提高效率, 甚至比不用 top 1 更慢。
aswangod 2018-08-29
  • 打赏
  • 举报
回复
一样的快!但是用最初的查询就是很慢,奇怪的问题
吉普赛的歌 2018-06-21
  • 打赏
  • 举报
回复
引用 8 楼 aswangod 的回复:
感觉没什么用,查询依旧很慢,不过变通了一个方法可行
Select Top 1 From FloatTable Where TagIndex=272 And DateAndTime between '当前时间' and '当前时间'
测试了一下,很快,不到1s,满足要求,以后查询就用存储过程算了。
不过没搞清楚什么原因,很是奇怪

正好用上了你#7的索引, 当然快。

你用我 #6 的索引试一下看看。
前后位置换了, 区别很大。
aswangod 2018-06-21
  • 打赏
  • 举报
回复
引用 9 楼 xiaoxiangqing 的回复:
语句是差不多,是执行计划自动优化的,可能是第二条语句返回的数据比较多吧

Top 1只返回一条数据啊
xiaoxiangqing 2018-06-21
  • 打赏
  • 举报
回复
语句是差不多,是执行计划自动优化的,可能是第二条语句返回的数据比较多吧
aswangod 2018-06-21
  • 打赏
  • 举报
回复
感觉没什么用,查询依旧很慢,不过变通了一个方法可行
Select Top 1 From FloatTable Where TagIndex=272 And DateAndTime between '当前时间' and '当前时间'
测试了一下,很快,不到1s,满足要求,以后查询就用存储过程算了。
不过没搞清楚什么原因,很是奇怪
aswangod 2018-06-21
  • 打赏
  • 举报
回复
删除了以前的索引,正在运行这个:CREATE NONCLUSTERED INDEX NC_IDX_FloatTable ON FloatTable(DateAndTime ASC, TagIndex ASC);
吉普赛的歌 2018-06-21
  • 打赏
  • 举报
回复
这样试一下看看:
--1. 删除原来没用的索引
DROP INDEX [FloatTableIndex] ON [dbo].[FloatTable]
--2. 建立新索引
CREATE NONCLUSTERED INDEX [FloatTableIndex] ON [dbo].[FloatTable]( [TagIndex], [DateAndTime] )
aswangod 2018-06-20
  • 打赏
  • 举报
回复
以前做过分区表、硬盘要求太大了(日志文件),实在不行,考虑做成内存表+触发器+永久表(分区、索引、),oh 天哪,头有点大
aswangod 2018-06-20
  • 打赏
  • 举报
回复
1.建立了一个索引,没有提高效率:
CREATE NONCLUSTERED INDEX [FloatTableIndex] ON [dbo].[FloatTable]
(
[DateAndTime] ASC
)
INCLUDE ( [TagIndex]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

2.执行sql:select tagindex,count(1) as cnt
from [xw].dbo.floattable with(nolock)
group by tagindex;

3.感觉是那个SQL分析引擎对两句话解释的不一样,导致效率不一样

丰云 2018-06-20
  • 打赏
  • 举报
回复
真没看出来这两个语句那里【差不多】。。。。。。。
shinger126 2018-06-20
  • 打赏
  • 举报
回复
第一句有行查找,第二句没有,应该是tagindex数据在值为270时很少,而为272时很多,这种情况下,对于top查询而言,在order by字段上建聚集索引应该可以解决。你可以尝试一下
吉普赛的歌 2018-06-20
  • 打赏
  • 举报
回复
select tagindex,count(1) as cnt 
from [xw].dbo.floattable with(nolock)
group by tagindex;
先查一下, 贴截图出来

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧