当前位置: 代码迷 >> Sql Server >> 表查询,该怎么处理
  详细解决方案

表查询,该怎么处理

热度:99   发布时间:2016-04-25 00:50:51.0
表查询
表A中有一列x(int)
表B中有两列y(int),z(int) 现在想查出y<=x and x<=z 的 表A 表B中所以的信息
------最佳解决方案--------------------
看了一下执行计划,如果不加聚集索引,那么63%时间用于排序,你试试我这个语句。
CREATE CLUSTERED INDEX PK_area ON B (area1 )
CREATE NONCLUSTERED INDEX N_area ON B(startip,endip)
CREATE NONCLUSTERED INDEX N_IP ON A(ipx)
SELECT area1,COUNT(a.ipx) 
FROM B b , a a 
WHERE  a.ipx BETWEEN b.startip AND b.endip
GROUP BY area1

------其他解决方案--------------------
看你业务需求,如果你的省市统计要求很细,那么B表的数据无法减少,比如去掉什么地级市这类,那只能靠8楼这种建索引的方式了。
A表要看你每天登陆信息有多少了,如果每天几百条,那么一个月也就几万条,无所谓。你可以每月创建一张新表,只保留一个月的记录,统计哪个月就去连接对应的月度表。如果每天登陆信息非常多,那么分区是一种选择方式。
另外还要看你的统计方式,如果你只要统计当天的,可以自动作业每天半夜将A表中数据转移至历史表。
最后还可以搞一个数据集市出来,使用SSIS来获取每天新的数据,然后更新维度表和事实表,使用SSAS来管理这个数据集市,使用SSRS做成你需要的统计报表。
------其他解决方案--------------------
select *
from A left join B on A.主键=B.主键
where x>=y and z>=z


如果你没有主键的话就会造成笛卡儿积
------其他解决方案--------------------
select * from a,b where y<=x and x<=z

------其他解决方案--------------------
select A,*,b.*
from A,B 
where b.y<=a.x and a.x<=b.z
------其他解决方案--------------------
x(int)
表B中有两列y(int),z(int) 现在想查出y<=x and x<=z 的 表A 表B中所以的信息

select * from a join b on y<=x and x<=z
------其他解决方案--------------------
数据在A表是一个接收用户登陆IP地址x=IPadress,B表是IP地址区域表(包括省市)y=startIP,z=endIP,
B表中几十万条数据,而且A表每天的数据量也很大,就是想统计每天各省市的访问量,以上方面试了,查询太慢了。各位有什么好的方法
------其他解决方案--------------------
你如果没有主键关联,他们的方法都是笛卡儿积,就是几十万乘以A表总数,好几十个亿都不止。
幻想不出你的表,试试:
select b.省市,count(a.主键)
from b left join a on a.x between b.y and b.z 
group by b.省市

------其他解决方案--------------------
A表:
TimeLogin datetime
TimeLogout datetime
IP varchar(15)    1.0.32.0
ipx numeric(18, 0) 16785409 IP转换为数据后

B表:                      值
startip numeric(18, 0) 16785408(1.0.32.0)
endip numeric(18, 0) 16793599(1.0.63.255)
area1 nvarchar(50)   广东省

------其他解决方案--------------------
引用:
看了一下执行计划,如果不加聚集索引,那么63%时间用于排序,你试试我这个语句。

SQL code

CREATE CLUSTERED INDEX PK_area ON B (area1 )
CREATE NONCLUSTERED INDEX N_area ON B(startip,endip)
CREATE NONCLUSTERED INDEX N_IP ON A(ipx)
SEL……


这个方法快了很多。但是我的A表中现在就几百条数据,如果A表数据上万条是不是有很大的问题。有没有其它更好的方法。比如重新创建一个IP与地址的表。每天把一天的IP与访问地址放进去,然后对这张表进行统计。
------其他解决方案--------------------
2005以后,可以考虑按省来分区,甚至安市来分区,这样搜索范围进一步减少
  相关解决方案