聚集索引我设置的是登陆日期,然后渠道类型是普通索引,现在我要查询在一段日期内的数据,并去重复
在网上看了看之后写的Sql语句:
SELECT DISTINCT 登陆ID FROM 用户登录表 WHERE 登陆日期 BETWEEN @DATE_START AND @DATE_END AND 渠道类型 = @渠道类型 (为了易读,用中文代替字段了,233)
有人说DISTINCT比GROUP BY效率,还有BETWEEN 比 >=, <=效率
这些到底对不对?还有人说如果在Sql语句中引入@参数则不使用索引搜索而搜索全表?
还有我想要两个数据集的交集,用ineer join 会不会降低效率?什么方式比较好?
最关键的问题,我做的这个工具是统计用户留存率和活跃度的,有一些数据需要累积统计,比如累积用户数量,和日活跃度,是不是做个历史表比较好?需要一些累积数据的话就直接在历史表里面读?
数据库小白,真心求解.
7 个解决方案
#1
有人说DISTINCT比GROUP BY效率,还有BETWEEN 比 >=, <=效率
这些即使有差异,也不会很大。具体要看业务需求。
引入@参数则不使用索引搜索而搜索全表?
如果没有类型转换,一般不会这样
还有我想要两个数据集的交集,用ineer join 会不会降低效率?什么方式比较好?
用什么join主要还是看业务,inner join 一般返回最少的数据量,通常高效。
最关键的问题,我做的这个工具是统计用户留存率和活跃度的,有一些数据需要累积统计,比如累积用户数量,和日活跃度,是不是做个历史表比较好?需要一些累积数据的话就直接在历史表里面读?
可以这样做
这些即使有差异,也不会很大。具体要看业务需求。
引入@参数则不使用索引搜索而搜索全表?
如果没有类型转换,一般不会这样
还有我想要两个数据集的交集,用ineer join 会不会降低效率?什么方式比较好?
用什么join主要还是看业务,inner join 一般返回最少的数据量,通常高效。
最关键的问题,我做的这个工具是统计用户留存率和活跃度的,有一些数据需要累积统计,比如累积用户数量,和日活跃度,是不是做个历史表比较好?需要一些累积数据的话就直接在历史表里面读?
可以这样做
#2
参数的问题,那我先
declare @渠道类型
set @渠道类型 = Convert(smallint,参数)
然后再 select * from 表 where [渠道类型] = @渠道类型
这样的话是不是就避免了搜索全表的问题?
还有很多数据类型的设定我有点迷惑,像渠道类型这种东西,0-255应该够了,我设的是smallint合不合理?
设定数据类型这方面怎么取舍呢?
#3
[渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,
#4
额,索引这玩意这么多说法呢啊...给跪了..
对了,还有一个问题请教,就是我在做插入数据的时候,是再存储过程内写的转换,C#代码里面没有处理数据类型,就是从文本文件里面取出来的字符串,然后直接传入到存储过程里面,再由存储过程转换数据类型,存入表内,这样的话好么?
#5
先结贴给分吧,下午公司组织打篮球,得晚上才能用电脑...
#6
数据量大的话建议放到sqlserver层面去做,C#处理业务逻辑比较合适。索引的问题,我看过400页的专门的书,都还有很多地方没说明白,一个贴是说不清楚的
#7
数据量大的话建议放到sqlserver层面去做,C#处理业务逻辑比较合适。索引的问题,我看过400页的专门的书,都还有很多地方没说明白,一个贴是说不清楚的
[渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,
额,索引这玩意这么多说法呢啊...给跪了..
对了,还有一个问题请教,就是我在做插入数据的时候,是再存储过程内写的转换,C#代码里面没有处理数据类型,就是从文本文件里面取出来的字符串,然后直接传入到存储过程里面,再由存储过程转换数据类型,存入表内,这样的话好么?
好的好的, 谢谢版主大大~
#1
有人说DISTINCT比GROUP BY效率,还有BETWEEN 比 >=, <=效率
这些即使有差异,也不会很大。具体要看业务需求。
引入@参数则不使用索引搜索而搜索全表?
如果没有类型转换,一般不会这样
还有我想要两个数据集的交集,用ineer join 会不会降低效率?什么方式比较好?
用什么join主要还是看业务,inner join 一般返回最少的数据量,通常高效。
最关键的问题,我做的这个工具是统计用户留存率和活跃度的,有一些数据需要累积统计,比如累积用户数量,和日活跃度,是不是做个历史表比较好?需要一些累积数据的话就直接在历史表里面读?
可以这样做
这些即使有差异,也不会很大。具体要看业务需求。
引入@参数则不使用索引搜索而搜索全表?
如果没有类型转换,一般不会这样
还有我想要两个数据集的交集,用ineer join 会不会降低效率?什么方式比较好?
用什么join主要还是看业务,inner join 一般返回最少的数据量,通常高效。
最关键的问题,我做的这个工具是统计用户留存率和活跃度的,有一些数据需要累积统计,比如累积用户数量,和日活跃度,是不是做个历史表比较好?需要一些累积数据的话就直接在历史表里面读?
可以这样做
#2
有人说DISTINCT比GROUP BY效率,还有BETWEEN 比 >=, <=效率
这些即使有差异,也不会很大。具体要看业务需求。
引入@参数则不使用索引搜索而搜索全表?
如果没有类型转换,一般不会这样
还有我想要两个数据集的交集,用ineer join 会不会降低效率?什么方式比较好?
用什么join主要还是看业务,inner join 一般返回最少的数据量,通常高效。
最关键的问题,我做的这个工具是统计用户留存率和活跃度的,有一些数据需要累积统计,比如累积用户数量,和日活跃度,是不是做个历史表比较好?需要一些累积数据的话就直接在历史表里面读?
可以这样做
参数的问题,那我先
declare @渠道类型
set @渠道类型 = Convert(smallint,参数)
然后再 select * from 表 where [渠道类型] = @渠道类型
这样的话是不是就避免了搜索全表的问题?
还有很多数据类型的设定我有点迷惑,像渠道类型这种东西,0-255应该够了,我设的是smallint合不合理?
设定数据类型这方面怎么取舍呢?
#3
[渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,
#4
[渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,
额,索引这玩意这么多说法呢啊...给跪了..
对了,还有一个问题请教,就是我在做插入数据的时候,是再存储过程内写的转换,C#代码里面没有处理数据类型,就是从文本文件里面取出来的字符串,然后直接传入到存储过程里面,再由存储过程转换数据类型,存入表内,这样的话好么?
#5
[渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,
先结贴给分吧,下午公司组织打篮球,得晚上才能用电脑...
#6
[渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,
额,索引这玩意这么多说法呢啊...给跪了..
对了,还有一个问题请教,就是我在做插入数据的时候,是再存储过程内写的转换,C#代码里面没有处理数据类型,就是从文本文件里面取出来的字符串,然后直接传入到存储过程里面,再由存储过程转换数据类型,存入表内,这样的话好么?
#7
数据量大的话建议放到sqlserver层面去做,C#处理业务逻辑比较合适。索引的问题,我看过400页的专门的书,都还有很多地方没说明白,一个贴是说不清楚的
[渠道类型] = @渠道类型如果这两个类型是相同的就不会引起类型转换,但是不代表不会扫描全表,这个要看数据量和分布、索引情况。如果0-255就足够的话,smallint比int更好,一般来说,越小越好,定长比变长好,
额,索引这玩意这么多说法呢啊...给跪了..
对了,还有一个问题请教,就是我在做插入数据的时候,是再存储过程内写的转换,C#代码里面没有处理数据类型,就是从文本文件里面取出来的字符串,然后直接传入到存储过程里面,再由存储过程转换数据类型,存入表内,这样的话好么?
好的好的, 谢谢版主大大~