两个问题,一个是数据库权限查询,另外一个是碎片问题。

时间:2022-05-25 23:28:36
需要收集每个地区对应单位的数据信息到某张表里面。该表其中有一个地区代码字段(AreaCode)来标识该插入数据隶属哪个地方单位的数据。
因为数据量很大。后台账号又要求根据建立账号的管理辖区来查看隶属辖区内的数据,不可以跨级查询。那么如何存储设计这个AreaCode。。
该字段采用全国标准地区表。。。比如  350622000000  。。。。那么就只允许350000000000或350600000000或3506220000000的人查询,不允许350622100000这种下属区域的管理用户查看。。。
问题一:因为数据量很大。。。。如果每次查询都是用这种Like似乎很不合理。有没有好的设计方案来解决这种高权限查询...
问题二:数据的大量插入导致索引碎片大量增多。。。是可以利用SQL 作业在凌晨进行重新生成索引。。。但在数据量达到几百万的时候,到时候会引起SQL Server比较长时间阻塞。。。一般你们如何解决?

8 个解决方案

#1


--1. 如果长度都一致,比较大小就好
SELECT * FROM t WHERE code<='350622000000'

--2. 索引碎片
--百万级的表不算大表,整理应该是比较快的,凌晨都还有很大业务量?
--硬件上可以换 IO性能好 的硬盘;
--整理的频率可以高一点,比如一天一次,整理得频繁,碎片就会少,下一次整理的时间会少很多


https://download.csdn.net/download/yenange/9540422

用这个工具测试你的磁盘(主要是数据库文件所在分区),  把结果截图贴上来。

#2


引用 1 楼 yenange 的回复:
--1. 如果长度都一致,比较大小就好
SELECT * FROM t WHERE code<='350622000000'

--2. 索引碎片
--百万级的表不算大表,整理应该是比较快的,凌晨都还有很大业务量?
--硬件上可以换 IO性能好 的硬盘;
--整理的频率可以高一点,比如一天一次,整理得频繁,碎片就会少,下一次整理的时间会少很多


https://download.csdn.net/download/yenange/9540422

用这个工具测试你的磁盘(主要是数据库文件所在分区),  把结果截图贴上来。

是的全国地区表代码都是固定规律的。你意思是不要用字符串类型存储,用数字类型存储。。然后查询时候直接查询数字范围来过滤查询?

#3


字符串也能直接比较大小, 不需要转换。
关键是是否等长, 再者有没有例外的情况需要考虑?

#4


引用 3 楼 yenange 的回复:
字符串也能直接比较大小, 不需要转换。
关键是是否等长, 再者有没有例外的情况需要考虑?

地区表格式是12个数字,每两个数字表示一个级别,不足12位的后缀用0表示。
这样字符串比较跟数字比较性能怎么样。。。如between  350000000000  and  350681000000

#5


char(12) 为 12 字节
bigint      为  8  字节
作为索引, 占用空间越小效率越高。

#6


引用 5 楼 yenange 的回复:
char(12) 为 12 字节
bigint      为  8  字节
作为索引, 占用空间越小效率越高。

受教了,谢谢指导

#7


引用 5 楼 yenange 的回复:
char(12) 为 12 字节
bigint      为  8  字节
作为索引, 占用空间越小效率越高。

可以推荐个SQL SERVER这类提升的书?我去买个当枕头

#8


1.《SQL Server 性能优化与管理的艺术》
2.《SQL Server2012 实施与管理实战指南》

没事就结贴吧.  两个问题,一个是数据库权限查询,另外一个是碎片问题。

#1


--1. 如果长度都一致,比较大小就好
SELECT * FROM t WHERE code<='350622000000'

--2. 索引碎片
--百万级的表不算大表,整理应该是比较快的,凌晨都还有很大业务量?
--硬件上可以换 IO性能好 的硬盘;
--整理的频率可以高一点,比如一天一次,整理得频繁,碎片就会少,下一次整理的时间会少很多


https://download.csdn.net/download/yenange/9540422

用这个工具测试你的磁盘(主要是数据库文件所在分区),  把结果截图贴上来。

#2


引用 1 楼 yenange 的回复:
--1. 如果长度都一致,比较大小就好
SELECT * FROM t WHERE code<='350622000000'

--2. 索引碎片
--百万级的表不算大表,整理应该是比较快的,凌晨都还有很大业务量?
--硬件上可以换 IO性能好 的硬盘;
--整理的频率可以高一点,比如一天一次,整理得频繁,碎片就会少,下一次整理的时间会少很多


https://download.csdn.net/download/yenange/9540422

用这个工具测试你的磁盘(主要是数据库文件所在分区),  把结果截图贴上来。

是的全国地区表代码都是固定规律的。你意思是不要用字符串类型存储,用数字类型存储。。然后查询时候直接查询数字范围来过滤查询?

#3


字符串也能直接比较大小, 不需要转换。
关键是是否等长, 再者有没有例外的情况需要考虑?

#4


引用 3 楼 yenange 的回复:
字符串也能直接比较大小, 不需要转换。
关键是是否等长, 再者有没有例外的情况需要考虑?

地区表格式是12个数字,每两个数字表示一个级别,不足12位的后缀用0表示。
这样字符串比较跟数字比较性能怎么样。。。如between  350000000000  and  350681000000

#5


char(12) 为 12 字节
bigint      为  8  字节
作为索引, 占用空间越小效率越高。

#6


引用 5 楼 yenange 的回复:
char(12) 为 12 字节
bigint      为  8  字节
作为索引, 占用空间越小效率越高。

受教了,谢谢指导

#7


引用 5 楼 yenange 的回复:
char(12) 为 12 字节
bigint      为  8  字节
作为索引, 占用空间越小效率越高。

可以推荐个SQL SERVER这类提升的书?我去买个当枕头

#8


1.《SQL Server 性能优化与管理的艺术》
2.《SQL Server2012 实施与管理实战指南》

没事就结贴吧.  两个问题,一个是数据库权限查询,另外一个是碎片问题。