2012-08-10 85 views
0

以下查询在针对SQL Server CE数据库运行sql时运行速度非常慢,我曾希望将其转换为EF的linq。任何人都可以建议,我还没有在SQL Server CE上创建任何索引。表2有100,000行。SQL Server CE存在子句性能

SELECT 
    * 
FROM 
    Table1 T1a 
WHERE 
    EXISTS 
(
SELECT 
    NULL 
FROM 
    Table2 T2 
     JOIN Table1 T1b ON T2.Field1 = T2.Field1 
WHERE 
    T2.SomeID = 12345 AND 
    T1a.SomeString = T1b.SomeString 
) 
ORDER BY 
    T1a.SomeString, 
    T1a.AnotherString 
+0

“我还没有写入索引” - 那就是问题了。您需要索引才能获得更好的性能。 – 2012-08-10 23:32:42

+0

就像在SQL Server中一样吗?这个查询中的任何明显的? – 2012-08-10 23:36:23

+0

你是不是要在'T2.Field1 = T1b.Field1'上写'JOIN Table1 T1b'?当前写入'T2.Field1 = T2.Field1'的方式与1 = 1的加入相同。 – RThomas 2012-08-10 23:54:57

回答

1

只考虑给出的信息。

对我来说T2.SomeID将是索引开始的最明显的地方。之后,您可能会看到T2.Field1,因为它在连接中使用(可能还有T1.Field1,具体取决于T1中的行数)。下一个可能会是T1.SomeString,因为它的比较使用以及它被用于某种排序。

不是T2.SomeID但是它的种类取决于数据的构成,每个值的基数,表中有多少行,还有多少其他查询。有多少更新VS查找将等等等等等等。

+0

谢谢。表2有250,000行,表1有1500.这主要是唯一的查询,不需要更新。 – 2012-08-10 23:48:53