请教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)
为什么要这样
如果是这样表设计的时候就欠考虑
可以考虑在写入数据的时候就格式化成这样的
或者
对两列做个计算列
然后对这个列建立索引