SqlServer2000查询数据表的优化问题

时间:2022-10-27 06:59:55
表的格式:  登陆日期   登陆ID ...  渠道类型

聚集索引我设置的是登陆日期,然后渠道类型是普通索引,现在我要查询在一段日期内的数据,并去重复

在网上看了看之后写的Sql语句:

SELECT DISTINCT 登陆ID FROM 用户登录表 WHERE 登陆日期 BETWEEN @DATE_START AND @DATE_END AND 渠道类型 = @渠道类型    (为了易读,用中文代替字段了,233)

有人说DISTINCT比GROUP BY效率,还有BETWEEN 比 >=, <=效率

这些到底对不对?还有人说如果在Sql语句中引入@参数则不使用索引搜索而搜索全表?

还有我想要两个数据集的交集,用ineer join 会不会降低效率?什么方式比较好?

最关键的问题,我做的这个工具是统计用户留存率和活跃度的,有一些数据需要累积统计,比如累积用户数量,和日活跃度,是不是做个历史表比较好?需要一些累积数据的话就直接在历史表里面读?

数据库小白,真心求解. SqlServer2000查询数据表的优化问题

7 个解决方案

#1


有人说DISTINCT比GROUP BY效率,还有BETWEEN 比 >=, <=效率
这些即使有差异,也不会很大。具体要看业务需求。

引入@参数则不使用索引搜索而搜索全表?
如果没有类型转换,一般不会这样

还有我想要两个数据集的交集,用ineer join 会不会降低效率?什么方式比较好?
用什么join主要还是看业务,inner join 一般返回最少的数据量,通常高效。

最关键的问题,我做的这个工具是统计用户留存率和活跃度的,有一些数据需要累积统计,比如累积用户数量,和日活跃度,是不是做个历史表比较好?需要一些累积数据的话就直接在历史表里面读?
可以这样做

#2


引用 1 楼 DBA_Huangzj 的回复:
有人说DISTINCT比GROUP BY效率,还有BETWEEN 比 >=, <=效率
这些即使有差异,也不会很大。具体要看业务需求。

引入@参数则不使用索引搜索而搜索全表?
如果没有类型转换,一般不会这样

还有我想要两个数据集的交集,用ineer join 会不会降低效率?什么方式比较好?
用什么join主要还是看业务,inner join 一般返回最少的数据量,通常高效。

最关键的问题,我做的这个工具是统计用户留存率和活跃度的,有一些数据需要累积统计,比如累积用户数量,和日活跃度,是不是做个历史表比较好?需要一些累积数据的话就直接在历史表里面读?
可以这样做


参数的问题,那我先
declare @渠道类型 
set @渠道类型 = Convert(smallint,参数)
然后再 select * from 表 where [渠道类型] = @渠道类型
这样的话是不是就避免了搜索全表的问题?

还有很多数据类型的设定我有点迷惑,像渠道类型这种东西,0-255应该够了,我设的是smallint合不合理?
设定数据类型这方面怎么取舍呢? SqlServer2000查询数据表的优化问题

#3


 [渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,

#4


引用 3 楼 DBA_Huangzj 的回复:
 [渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,


额,索引这玩意这么多说法呢啊...给跪了..

对了,还有一个问题请教,就是我在做插入数据的时候,是再存储过程内写的转换,C#代码里面没有处理数据类型,就是从文本文件里面取出来的字符串,然后直接传入到存储过程里面,再由存储过程转换数据类型,存入表内,这样的话好么?

#5


引用 3 楼 DBA_Huangzj 的回复:
 [渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,


先结贴给分吧,下午公司组织打篮球,得晚上才能用电脑...

#6


引用 4 楼 fyssqzh555 的回复:
Quote: 引用 3 楼 DBA_Huangzj 的回复:

 [渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,


额,索引这玩意这么多说法呢啊...给跪了..

对了,还有一个问题请教,就是我在做插入数据的时候,是再存储过程内写的转换,C#代码里面没有处理数据类型,就是从文本文件里面取出来的字符串,然后直接传入到存储过程里面,再由存储过程转换数据类型,存入表内,这样的话好么?
数据量大的话建议放到sqlserver层面去做,C#处理业务逻辑比较合适。索引的问题,我看过400页的专门的书,都还有很多地方没说明白,一个贴是说不清楚的

#7


引用 6 楼 DBA_Huangzj 的回复:
Quote: 引用 4 楼 fyssqzh555 的回复:

Quote: 引用 3 楼 DBA_Huangzj 的回复:

 [渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,


额,索引这玩意这么多说法呢啊...给跪了..

对了,还有一个问题请教,就是我在做插入数据的时候,是再存储过程内写的转换,C#代码里面没有处理数据类型,就是从文本文件里面取出来的字符串,然后直接传入到存储过程里面,再由存储过程转换数据类型,存入表内,这样的话好么?
数据量大的话建议放到sqlserver层面去做,C#处理业务逻辑比较合适。索引的问题,我看过400页的专门的书,都还有很多地方没说明白,一个贴是说不清楚的


好的好的, 谢谢版主大大~

#1


有人说DISTINCT比GROUP BY效率,还有BETWEEN 比 >=, <=效率
这些即使有差异,也不会很大。具体要看业务需求。

引入@参数则不使用索引搜索而搜索全表?
如果没有类型转换,一般不会这样

还有我想要两个数据集的交集,用ineer join 会不会降低效率?什么方式比较好?
用什么join主要还是看业务,inner join 一般返回最少的数据量,通常高效。

最关键的问题,我做的这个工具是统计用户留存率和活跃度的,有一些数据需要累积统计,比如累积用户数量,和日活跃度,是不是做个历史表比较好?需要一些累积数据的话就直接在历史表里面读?
可以这样做

#2


引用 1 楼 DBA_Huangzj 的回复:
有人说DISTINCT比GROUP BY效率,还有BETWEEN 比 >=, <=效率
这些即使有差异,也不会很大。具体要看业务需求。

引入@参数则不使用索引搜索而搜索全表?
如果没有类型转换,一般不会这样

还有我想要两个数据集的交集,用ineer join 会不会降低效率?什么方式比较好?
用什么join主要还是看业务,inner join 一般返回最少的数据量,通常高效。

最关键的问题,我做的这个工具是统计用户留存率和活跃度的,有一些数据需要累积统计,比如累积用户数量,和日活跃度,是不是做个历史表比较好?需要一些累积数据的话就直接在历史表里面读?
可以这样做


参数的问题,那我先
declare @渠道类型 
set @渠道类型 = Convert(smallint,参数)
然后再 select * from 表 where [渠道类型] = @渠道类型
这样的话是不是就避免了搜索全表的问题?

还有很多数据类型的设定我有点迷惑,像渠道类型这种东西,0-255应该够了,我设的是smallint合不合理?
设定数据类型这方面怎么取舍呢? SqlServer2000查询数据表的优化问题

#3


 [渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,

#4


引用 3 楼 DBA_Huangzj 的回复:
 [渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,


额,索引这玩意这么多说法呢啊...给跪了..

对了,还有一个问题请教,就是我在做插入数据的时候,是再存储过程内写的转换,C#代码里面没有处理数据类型,就是从文本文件里面取出来的字符串,然后直接传入到存储过程里面,再由存储过程转换数据类型,存入表内,这样的话好么?

#5


引用 3 楼 DBA_Huangzj 的回复:
 [渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,


先结贴给分吧,下午公司组织打篮球,得晚上才能用电脑...

#6


引用 4 楼 fyssqzh555 的回复:
Quote: 引用 3 楼 DBA_Huangzj 的回复:

 [渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,


额,索引这玩意这么多说法呢啊...给跪了..

对了,还有一个问题请教,就是我在做插入数据的时候,是再存储过程内写的转换,C#代码里面没有处理数据类型,就是从文本文件里面取出来的字符串,然后直接传入到存储过程里面,再由存储过程转换数据类型,存入表内,这样的话好么?
数据量大的话建议放到sqlserver层面去做,C#处理业务逻辑比较合适。索引的问题,我看过400页的专门的书,都还有很多地方没说明白,一个贴是说不清楚的

#7


引用 6 楼 DBA_Huangzj 的回复:
Quote: 引用 4 楼 fyssqzh555 的回复:

Quote: 引用 3 楼 DBA_Huangzj 的回复:

 [渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,


额,索引这玩意这么多说法呢啊...给跪了..

对了,还有一个问题请教,就是我在做插入数据的时候,是再存储过程内写的转换,C#代码里面没有处理数据类型,就是从文本文件里面取出来的字符串,然后直接传入到存储过程里面,再由存储过程转换数据类型,存入表内,这样的话好么?
数据量大的话建议放到sqlserver层面去做,C#处理业务逻辑比较合适。索引的问题,我看过400页的专门的书,都还有很多地方没说明白,一个贴是说不清楚的


好的好的, 谢谢版主大大~