各位,求助,大数据量,select语句

时间:2022-09-16 19:53:31
最近一周数据库mdf文件疯长,一看居然是某张表中在这一周之内插入了一亿六千万行数据
这张表存放的是应用程序的报错信息,而且在插入的时候,是按照时间排序的

然后我想看下最近插入的几条记录 order by desc一下
然后发现查询了5分钟,报错,Tempdb把SSID的空间全部吃光了。。。
应该是为了order by subtime,需要把所有结果都扫描一遍的原因吧?

我的语句是select ErrorMessage,SubTime form Errors order by SubTime desc
然后就想问问

怎么样能快速的取得【倒序排列】的效果?

21 个解决方案

#1



select top 100 ErrorMessage,SubTime form Errors order by SubTime desc

#2


 SubTime 字段加索引。

#3


如此大的數據量,硬件需要支持

表有沒有用到分區表

#4


谢二楼 
这个也要把表中所有数据都扫描一遍。。。才有top100

#5


回小F:
本身列上面没有索引,直接创建索引的话,会不会让表变得更大?

#6


回大版:
这张表没有分区,之前没想到这张表会如此巨大,直接放primary文件组中了。。。

#7


引用 5 楼 xyc880813 的回复:
回小F:
本身列上面没有索引,直接创建索引的话,会不会让表变得更大?


再大也没你一天插入的数据大吧,一周一亿六千万...
我了个去,要是换成钱的话,我数数... 各位,求助,大数据量,select语句

#8


一亿六千万行?还查什么?内存吃不消.

你可以考虑使用条件去查询.

例如:

select * from tb where ... order by ...

#9


引用 6 楼 xyc880813 的回复:
回大版:
这张表没有分区,之前没想到这张表会如此巨大,直接放primary文件组中了。。。

用日期列作為分區+分DB+分服務器。過億的數據,硬件要求很高啊,最好在程序里處理新增到不同的服務器處理

#10


都是什麼數據,一周內過億,你看一下表的大小是?表過大分區分DB是一定的

#11


回大乌龟:主要是想看看是具体的报错信息是什么,我不知道表里面是什么内容,没法写条件。。。
有没有一个【类似指针】的东西,直接指向这张表的【末尾】,然后开始select呢?
引用 8 楼 dawugui 的回复:
一亿六千万行?还查什么?内存吃不消.

你可以考虑使用条件去查询.

例如:

select * from tb where ... order by ...

#12


回大板:
这表是报错表,按照之前的经验来看,这表里插入的数据会很少,现在肯定是哪个地方报错了,而且是每时每秒都在报错,才有可能有这么大的插入数据量。。。
然后我就想找找里面的内容,看看是是哪里报错了
引用 9 楼 roy_88 的回复:
引用 6 楼 xyc880813 的回复:

回大版:
这张表没有分区,之前没想到这张表会如此巨大,直接放primary文件组中了。。。

用日期列作為分區+分DB+分服務器。過億的數據,硬件要求很高啊,最好在程序里處理新增到不同的服務器處理

#13


表的大小32G,哭了

#14


就是索引了,时间字段建索引
然后再select top 100 ... order by 时间 desc
不过机器吃不吃得消就只有你自己试了才知道了
引用 11 楼 xyc880813 的回复:
回大乌龟:主要是想看看是具体的报错信息是什么,我不知道表里面是什么内容,没法写条件。。。
有没有一个【类似指针】的东西,直接指向这张表的【末尾】,然后开始select呢?

引用 8 楼 dawugui 的回复:

一亿六千万行?还查什么?内存吃不消.

你可以考虑使用条件去查询.

例如:

select * from tb where ... order by ...
……

#15


该回复于2011-11-17 16:49:01被版主删除

#16


明白了,按照desc 在subtime上建立索引,
然后再Order by subtime desc就会直接利用这个索引了!!
引用 14 楼 geniuswjt 的回复:
就是索引了,时间字段建索引
然后再select top 100 ... order by 时间 desc
不过机器吃不吃得消就只有你自己试了才知道了引用 11 楼 xyc880813 的回复:
回大乌龟:主要是想看看是具体的报错信息是什么,我不知道表里面是什么内容,没法写条件。。。
有没有一个【类似指针】的东西,直接指向这张表的【末尾】,然后开始select呢?

引用 8 楼 da……

#17


你应该有个时间字段吧?可否考虑用时间字段来做条件?

如果不行,可把文件导出去,导成TXT文件,然后更改后缀为doc,打开这个word文档去里面看具体内容.

#18


引用 13 楼 xyc880813 的回复:
表的大小32G,哭了

怎么看表的大小32G的

#19


回大乌龟:
多谢,我去试试
引用 17 楼 dawugui 的回复:
你应该有个时间字段吧?可否考虑用时间字段来做条件?

如果不行,可把文件导出去,导成TXT文件,然后更改后缀为doc,打开这个word文档去里面看具体内容.

#20


引用 18 楼 pengxuan 的回复:
引用 13 楼 xyc880813 的回复:
表的大小32G,哭了

怎么看表的大小32G的

在SMSS中右键点击那张表,属性,里面就有表大小

#21


各位,报错的结果查出来了,我都震惊了不敢相信:
【列名 'loginnameReg' 无效。】
。。。
来自于某个服务,以每0.017秒3次的频率往这表里面插入记录
。。。
。。。
。。。

#1



select top 100 ErrorMessage,SubTime form Errors order by SubTime desc

#2


 SubTime 字段加索引。

#3


如此大的數據量,硬件需要支持

表有沒有用到分區表

#4


谢二楼 
这个也要把表中所有数据都扫描一遍。。。才有top100

#5


回小F:
本身列上面没有索引,直接创建索引的话,会不会让表变得更大?

#6


回大版:
这张表没有分区,之前没想到这张表会如此巨大,直接放primary文件组中了。。。

#7


引用 5 楼 xyc880813 的回复:
回小F:
本身列上面没有索引,直接创建索引的话,会不会让表变得更大?


再大也没你一天插入的数据大吧,一周一亿六千万...
我了个去,要是换成钱的话,我数数... 各位,求助,大数据量,select语句

#8


一亿六千万行?还查什么?内存吃不消.

你可以考虑使用条件去查询.

例如:

select * from tb where ... order by ...

#9


引用 6 楼 xyc880813 的回复:
回大版:
这张表没有分区,之前没想到这张表会如此巨大,直接放primary文件组中了。。。

用日期列作為分區+分DB+分服務器。過億的數據,硬件要求很高啊,最好在程序里處理新增到不同的服務器處理

#10


都是什麼數據,一周內過億,你看一下表的大小是?表過大分區分DB是一定的

#11


回大乌龟:主要是想看看是具体的报错信息是什么,我不知道表里面是什么内容,没法写条件。。。
有没有一个【类似指针】的东西,直接指向这张表的【末尾】,然后开始select呢?
引用 8 楼 dawugui 的回复:
一亿六千万行?还查什么?内存吃不消.

你可以考虑使用条件去查询.

例如:

select * from tb where ... order by ...

#12


回大板:
这表是报错表,按照之前的经验来看,这表里插入的数据会很少,现在肯定是哪个地方报错了,而且是每时每秒都在报错,才有可能有这么大的插入数据量。。。
然后我就想找找里面的内容,看看是是哪里报错了
引用 9 楼 roy_88 的回复:
引用 6 楼 xyc880813 的回复:

回大版:
这张表没有分区,之前没想到这张表会如此巨大,直接放primary文件组中了。。。

用日期列作為分區+分DB+分服務器。過億的數據,硬件要求很高啊,最好在程序里處理新增到不同的服務器處理

#13


表的大小32G,哭了

#14


就是索引了,时间字段建索引
然后再select top 100 ... order by 时间 desc
不过机器吃不吃得消就只有你自己试了才知道了
引用 11 楼 xyc880813 的回复:
回大乌龟:主要是想看看是具体的报错信息是什么,我不知道表里面是什么内容,没法写条件。。。
有没有一个【类似指针】的东西,直接指向这张表的【末尾】,然后开始select呢?

引用 8 楼 dawugui 的回复:

一亿六千万行?还查什么?内存吃不消.

你可以考虑使用条件去查询.

例如:

select * from tb where ... order by ...
……

#15


该回复于2011-11-17 16:49:01被版主删除

#16


明白了,按照desc 在subtime上建立索引,
然后再Order by subtime desc就会直接利用这个索引了!!
引用 14 楼 geniuswjt 的回复:
就是索引了,时间字段建索引
然后再select top 100 ... order by 时间 desc
不过机器吃不吃得消就只有你自己试了才知道了引用 11 楼 xyc880813 的回复:
回大乌龟:主要是想看看是具体的报错信息是什么,我不知道表里面是什么内容,没法写条件。。。
有没有一个【类似指针】的东西,直接指向这张表的【末尾】,然后开始select呢?

引用 8 楼 da……

#17


你应该有个时间字段吧?可否考虑用时间字段来做条件?

如果不行,可把文件导出去,导成TXT文件,然后更改后缀为doc,打开这个word文档去里面看具体内容.

#18


引用 13 楼 xyc880813 的回复:
表的大小32G,哭了

怎么看表的大小32G的

#19


回大乌龟:
多谢,我去试试
引用 17 楼 dawugui 的回复:
你应该有个时间字段吧?可否考虑用时间字段来做条件?

如果不行,可把文件导出去,导成TXT文件,然后更改后缀为doc,打开这个word文档去里面看具体内容.

#20


引用 18 楼 pengxuan 的回复:
引用 13 楼 xyc880813 的回复:
表的大小32G,哭了

怎么看表的大小32G的

在SMSS中右键点击那张表,属性,里面就有表大小

#21


各位,报错的结果查出来了,我都震惊了不敢相信:
【列名 'loginnameReg' 无效。】
。。。
来自于某个服务,以每0.017秒3次的频率往这表里面插入记录
。。。
。。。
。。。