日期:2014-05-18  浏览次数:20749 次

请教1个SQL语句的性能问题,多谢!
Create Table #TDept --部门表 

  DeptID int --部门ID 

Create Table #Product --产品表 

  ProductID int --产品ID 

Create Table #TDeptProduct --部门产品 (DeptID+ProductID 建有索引) 

  DeptID int, --部门ID  
  ProductID int --部门产品ID 

--插入部门数据 
Insert #TDept 
Select 8 Union 
Select 12 union 
Select 7 union 
Select 74 
--插入产品数据 
Insert #Product 
Select 23 Union 
Select 126 Union 
Select 823 Union 
Select 41 Union 
Select 1 
--插入部门产品数据 
Insert #TDeptProduct 
Select 8, 823 Union 
Select 8, 126 Union 
Select 12, 41 Union 
Select 7, 41 Union 
Select 7, 126 

--查询出哪些 部门+产品 在部门产品资料中还没有存在
Select DeptID, ProductID From #TDept, #Product 
Where Cast(DeptID As Varchar) + ':' + Cast(ProductID as Varchar) Not in 
(Select Cast(DeptID As Varchar) + ':' + Cast(ProductID as Varchar) From #TDeptProduct)

由于#Product 表实际有几万行数据,#Dept有几十行,#TDeptProduct 表有上百万行数据。
如果我直接执行Select DeptID, ProductID From #TDept, #Product 速度还是挺快的。可是带
上Where语句以后,速度就非常慢。而且Cast(DeptID As Varchar) + ':' + Cast(ProductID as Varchar)
的写法,索引(DeptID+ProductID)应该也不能用了。
请问: 这条SQL语句的更好的写法,可以很大程度上加快速度的? 多谢!

------解决方案--------------------
你两个表没连接条件?#TDept, #Product
------解决方案--------------------
这样试试
SQL code
Select DeptID, ProductID From #TDept, #Product
EXCEPT
SELECT DeptID,ProductID FROM #TDeptProduct

------解决方案--------------------
try:
SQL code
select a.DeptID,b.ProductID From #TDept a,#Product b
where not exists(select 1 from #TDeptProduct where DeptID=a.DeptID and ProductID=b.ProductID)

------解决方案--------------------
Cast(DeptID As Varchar) + ':' + Cast(ProductID as Varchar)
为什么要这样
如果是这样表设计的时候就欠考虑
可以考虑在写入数据的时候就格式化成这样的
或者
对两列做个计算列 
然后对这个列建立索引