今天主管讓測試大數據量查詢的問題(數據條數上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
這種辦法的弊端顯然易見,如果數據恰巧在最后一張表里面,那么查詢肯定會非常慢。但是現在我還沒有想到好的解決辦法。
特留下此筆記,等待解決。
