如何优化查询? T-SQL

时间:2011-06-02 06:23:08

标签: sql sql-server-2005 tsql

此查询大约需要3分钟,并返回7279行:

SELECT identity(int,1,1) as id, c.client_code, a.account_num, 
        c.client_short_name, u.uso, us.fio, null as new, null as txt 
INTO #ttable
FROM accounts a INNER JOIN Clients c ON 
    c.id = a.client_id INNER JOIN Uso u ON c.uso_id = u.uso_id INNER JOIN 
    Magazin m ON a.account_id = m.account_id LEFT JOIN Users us ON 
    m.user_id = us.user_id
WHERE m.status_id IN ('1','5','9') AND m.account_new_num is null 
    AND u.branch_id = @branch_id
ORDER BY c.client_code;

'client_code'字段的类型是VARCHAR(6)。

是否有可能以某种方式优化此查询?

4 个答案:

答案 0 :(得分:1)

将记录插入临时表中,而不使用Order by Clause ,然后使用c.client_code对它们进行排序。希望它能帮到你。

创建表#temp ( 你的专栏...... )

在此表中插入记录 不使用按条款排序。现在使用按条目排序

运行选择

答案 1 :(得分:0)

您是否为表格设置了索引?外键列以及Magazin.status的索引可能有所帮助。

答案 2 :(得分:0)

  1. 确保在JOIN和WHERE子句中使用的每个字段都有索引
  2. 如果您选择的一个或多个表实际上是视图,则问题可能出在这些视图的执行上。

答案 3 :(得分:0)

如果在where子句中引用了表,则总是先尝试列出表 - 它会尽可能早地切断行组合。在这种情况下,Magazin表在where子句中有一些谓词,但在表列表中列出。这意味着所有其他联接必须在之前进行可以过滤Magazin行 - 可能是数百万的额外行。

试试这个(让我们知道它是怎么回事):

SELECT ... 
INTO #ttable
FROM accounts a
INNER JOIN Magazin m ON a.account_id = m.account_id
INNER JOIN Clients c ON c.id = a.client_id
INNER JOIN Uso u ON c.uso_id = u.uso_id
LEFT JOIN Users us ON m.user_id = us.user_id
WHERE m.status_id IN ('1','5','9')
AND m.account_new_num is null 
AND u.branch_id = @branch_id
ORDER BY c.client_code; 

这种优化可以大大提高查询性能。