今天主管让测试大数据量查询的问题(数据条数上3000万),我解决的思路是将表拆分成多张表来减少查询时间
那么涉及到多表之间的联合查询怎么查,怎么实现才能达到效率最大化。
思路:1、根据分表逻辑查询,这个比较简单用动态SQL语句就可以实现
我的分表逻辑是根据字段CardNumber末尾数字拆分的,将其拆分为0-9这十张表。
1 DECLARE @CardNumber VARCHAR(50) 2 DECLARE @Index AS VARCHAR(1) 3 DECLARE @sql AS VARCHAR(1000) 4 5 SET @Index = RIGHT(@CardNumber,1) 6 7 SET @sql = N'select * from dbo.Customer_' + @Index +' Where CardNumber='''+@CardNumber+'''' 8 9 EXEC(@sql)
这个比较简单,数度也相对很快,百万级的数量查询时间在5秒内。
2.如果查询条件和分表逻辑关系不大,那么联合查询就比较麻烦了。我的思路是判断当第一张表里不存在,进入第二张表,第二张表里不存在进入第三张...以此类推。
1 CREATE TABLE #Temp_Customer( 2 [CustomerID] int, 3 [CustomerName] varchar(50), 4 [CardNumber] varchar(100), 5 [CardNo] varchar(100) NULL 6 ) 10 11 DECLARE @tableIndex INT 12 13 SET @tableIndex = 0 14 15 WHILE (@tableIndex < 10) 16 BEGIN 17 SET @sql = N'select * from dbo.Customer_' +CAST(@tableIndex AS VARCHAR(1)) 18 19 20 IF(@CardNo IS NOT NULL) 21 BEGIN 22 SET @sql = @sql +' Where CardNo='''+ @CardNo +'''' 23 END 24 25 INSERT INTO #Temp_Customer 26 ( CustomerID , 27 CustomerName , 28 CardNumber , 29 CardNo 30 ) 31 EXEC(@sql) 32 33 DECLARE @i int 34 SET @i = (SELECT COUNT(*) FROM #Temp_Customer) 35 IF (@i>0) 36 BEGIN 37 SET @tableIndex = 10 38 END 39 ELSE 40 BEGIN 41 SET @tableIndex = @tableIndex + 1 42 END 43 END 44 45
这种办法的弊端显然易见,如果数据恰巧在最后一张表里面,那么查询肯定会非常慢。但是现在我还没有想到好的解决办法。
特留下此笔记,等待解决。