2011-09-13 22 views
0

我昨天已经问过类似的问题。 (Question
但是在定制查询后 - 性能非常差。不知道如何建立一个快速查询

现状

表位(计数:800'000)

Id Number Leafnode From To VersionId 
-- --------- -------- ---- ---- --------- 
1 100200300  0 NULL NULL  33 
2 100200301  1 NULL NULL  34 
3 100200302  1 5 10  34 
... 

表变量(计数:1'300'000)

Id Number PositionId 
-- ------ ---------- 
1  01   2 
2  01   3 
3  02   3 
4  03   3 
.... 

Table VariableText(Count:1'300'000)

Id Language  Text VariableId 
-- -------- ---------- ---------- 
1  1  Hello   1 
2  2  Hallo   1 
3  3  Salut   1 
4  1  Bye   2 
5  2  Tschau   2 
... 


我正在寻找一个好的执行查询(视图,存储过程,用户功能)。从我的应用程序,我想使用类似的查询:

SELECT Id, Number, Text, Variable 
FROM <whatever> 
WHERE Language = 2 AND Version = 34 AND Number IN (100200301, 100200305) 

而结果是建议立即进行删除:

Id  Number Text Variable 
-- --------- ------ -------- 
2 100200301 Hallo  01 
3 100200305 Tschau  01 
... 


UPDATE 我上传的数据库备份包含这三个上面描述的表格。 ( Backup
我使用以下查询从位置表中返回'数字'和'id'。没有加入,也没有其他的东西。这个查询大约需要8分钟。

WITH C AS 
(
    SELECT T.Id, CAST(Number AS int) AS Nr, Version 
    FROM Position AS T 
    WHERE Leafnode = 1 

    UNION ALL 

    SELECT T.Id, Nr + 1 AS Expr1, T.[Version] 
    FROM dbo.Position AS T 
    INNER JOIN C ON C.Id = T.Id AND T.[To] > CAST(STUFF(Nr, 1, 6, '') AS int) 
) 

SELECT Id, Nr, [Version] 
FROM C 
WHERE Version = 34 AND Nr = '241521123' 
OPTION (maxrecursion 0) 
+3

看看猜测和实际的查询计划 - 它甚至提供了潜在索引的提示!从SQL Management Studio中轻松查看,并包含可爱的图表。 – 2011-09-13 08:35:50

回答

1

查询性能可以通过在右列上创建正确的索引(聚集/非聚集/复合/ ...)来提高。

您可以使用查询计划来确定应该在哪个列上创建索引。

您搜索,排序和加入的列上的索引可以作为索引的候选项。

0

您可能要添加的列语言,版本和数量

0

您可以启用通过使用SET STATISTICS PROFILE ON的查询性能统计部分指标。这将显示查询的每个部分以及需要多长时间,哪个应该让您知道什么会放慢速度。

我怀疑它使用的IN运算符。您可以更改为WHERE(数= 100200301或Number = 100200305)

http://wraithnath.blogspot.com/2011/01/getting-performance-data-from-sql.html

+2

人们希望查询优化器能够自动进行建议的优化。 –

0

你应该检查通过optmizer(从查询计划)使用表的顺序。我认为它应该像位置表驱动查询(它应该是外部表)作为它的大部分数据。如果其他表驱动查询,则强制计划并将位置表作为外部表。 还可以检查查询是否使用正确的索引,如果长时间未更新,则更新表的统计信息。

0

这可能是导致问题

INNER JOIN C ON C.Id = T.Id AND T.[To] > CAST(STUFF(Nr, 1, 6, '') AS int)

从众多卸下前6位数字是不是可优化搜索,并有可能造成一些问题。

有几种方法来处理这一点,但可能是最方便的是创建一个index on a computed column在计算列是STUFF(Number, 1, 6, '')

这需要SQL Server 2005或更高版本(注意:!=