求一个大数据排序的解决办法!!!

heochuan 2017-05-12 09:14:37
我现在是想解决sqlserver字符排序的问题,“编号”列是字符类型,变准的话就是数字,按照数字类型排序,问题是有的时候还会出现-或者.的字符,所以不能把类型改成int,那样也就不会出现今天这个问题。
如果单纯的order by排序,下面是sql语句,索引和分页都有。
select * from (select top 200 row_number() over(order by "编号") as rowid,* from TEST) as t where rowid > 100
100~200百万的数据都挺快的。
但这样排序不是正确的,它是会1、10、11、2、3、。。。这样排,因为是字符型,
所以我用了函数order by right(REPLICATE('0',10) + cast("编号" AS varchar(10)),10) 这样排序,结果是正确了。
可是数据量大起来速度就不行了,
有没有大神能帮我解决一下这个问题,我相信肯定会有遇到过类似的问题吧,你们都是怎么解决的?
有什么更好的方案呢?
...全文
702 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zy_arhahaha 2017-05-12
  • 打赏
  • 举报
回复
字符类型的编号为什么不设置长度,前面补零
逗泥丸的平方 2017-05-12
  • 打赏
  • 举报
回复
难过, 好像 用了函数索引就gg了 explain 看一下吧 有一个神操作是 OROUP BY LENGTH(code),code 不过感觉够呛能用. 而且你说的有点和有-的情况 不知道排序的时候怎么看
逗泥丸的平方 2017-05-12
  • 打赏
  • 举报
回复
我突然想起来一个事情......... 你这是数据库的问题啊 为什么在java区问
世纪大烧饼 2017-05-12
  • 打赏
  • 举报
回复
学习一下
逗泥丸的平方 2017-05-12
  • 打赏
  • 举报
回复
对了 好像有个新科技叫 函数索引 不过 对我来说比较复杂了 我也不怎么玩数据库..... 你可以自己看看或者再找大神问问...? 当然,我也不知道对增删的影响有多大.
逗泥丸的平方 2017-05-12
  • 打赏
  • 举报
回复
引用 12 楼 qq_35209952 的回复:
[quote=引用 4 楼 heochuan 的回复:] 有索引,没有索引的话大数据量第一种sql查询都很慢了, 第二种排序查询有没有更优化一点的,现在的速度不行,没法用
数据库我不是很熟悉, 但是根据索引的原理来讲, 使用函数会导致索引失效吧.. 你把人家索引的东西都改了,他也没法根据索引来快速查找了吧.[/quote] 又打错了 这里应该没有查找 是排序. 其实这个问题的根源还是表设计的不合理.. 现在只是尽可能的找一个补救方式了..,如果不能使用原有信息,那只能是很悲伤了.. 一个这么大量的数据库.. 要很小心才对吧. 为什么会出现这样奇怪的设计呢..
逗泥丸的平方 2017-05-12
  • 打赏
  • 举报
回复
引用 4 楼 heochuan 的回复:
[quote=引用 3 楼 zhujinqiang 的回复:] “编号”列是字符类型 --这列有加上索引吗?
有索引,没有索引的话大数据量第一种sql查询都很慢了, 第二种排序查询有没有更优化一点的,现在的速度不行,没法用[/quote] 数据库我不是很熟悉, 但是根据索引的原理来讲, 使用函数会导致索引失效吧.. 你把人家索引的东西都改了,他也没法根据索引来快速查找了吧.
mmqw 2017-05-12
  • 打赏
  • 举报
回复
可以增加一个专门用来排序的字段
逗泥丸的平方 2017-05-12
  • 打赏
  • 举报
回复
引用 5 楼 heochuan 的回复:
[quote=引用 1 楼 qq_35209952 的回复:] 难过, 好像 用了函数索引就gg了 explain 看一下吧 有一个神操作是 OROUP BY LENGTH(code),code 不过感觉够呛能用. 而且你说的有点和有-的情况 不知道排序的时候怎么看
OROUP BY LENGTH(code),code是什么方法啊,sql server2005我用的数据库,不明白怎么用[/quote] 呃.. LENGTH就是取长度的函数, sqlserver里面具体对应什么我也不知道,你可以查一下.. 另外是GROUP 我打错了. 思路就是按长度排序再按字符排序
miaoch 2017-05-12
  • 打赏
  • 举报
回复
如果是全数字的话,你的写法改成另外一个人说的写法比较好 OROUP BY LENGTH(code),code 首先比较长度(排除0数字开头) 如果数字位数更多,肯定更大。 若果位数一样。那么字符串的比较和数字比较结果是一致的
miaoch 2017-05-12
  • 打赏
  • 举报
回复
且你原来这样的写法其实也不对。因为你没有排除,- 我不知道,-在字符串编码中是不是大于数字的, 但是如果是123- 和130 按照你的order 应该是000000123- 和 0000000130 很明显前面的大于后面的。但是我总觉得你的意思应该是后面的大 所以我觉得得把非数字符号去掉。 如果你觉得不用去,那我觉得你不如直接按字符去排序得了。 因为你这样的写法本身就是四不像
miaoch 2017-05-12
  • 打赏
  • 举报
回复
你可以先把. - 这些字符先移除 再转成int试试
heochuan 2017-05-12
  • 打赏
  • 举报
回复
引用 2 楼 qq2890974020 的回复:
字符类型的编号为什么不设置长度,前面补零
不要补0的, 一般情况下就是1、2、3、4这样的数字,但是不保证会出现1-2、1.2这样的字符, 所以才设置成字符类型,如果是int类型,那直接order by排序就可以了,什么都不用,建个索引,大数据量也很快。 但是现在是字符类型,单纯的order by排序会出现1、10、11、12、2、3、4、这样的顺序, 像我上面那样用了内置方法处理,结果是有了,但是数据量大速度没法看啊。
heochuan 2017-05-12
  • 打赏
  • 举报
回复
引用 1 楼 qq_35209952 的回复:
难过, 好像 用了函数索引就gg了 explain 看一下吧 有一个神操作是 OROUP BY LENGTH(code),code 不过感觉够呛能用. 而且你说的有点和有-的情况 不知道排序的时候怎么看
OROUP BY LENGTH(code),code是什么方法啊,sql server2005我用的数据库,不明白怎么用
heochuan 2017-05-12
  • 打赏
  • 举报
回复
引用 3 楼 zhujinqiang 的回复:
“编号”列是字符类型 --这列有加上索引吗?
有索引,没有索引的话大数据量第一种sql查询都很慢了, 第二种排序查询有没有更优化一点的,现在的速度不行,没法用
zhujinqiang 2017-05-12
  • 打赏
  • 举报
回复
“编号”列是字符类型 --这列有加上索引吗?

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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