繁体   English   中英

该查询的性能调优?

[英]Performance tuning of this query?

我在下面的查询中支持按员工姓名排序的员工分页

SELECT rowNumAlias
    ,Employee.employeeId
    ,Employee.NAME
FROM (
    SELECT row_number() OVER (
            ORDER BY Employee.NAME ASC
            ) rowNumAlias
        ,employeeId
        ,NAME
    FROM Employee
    ) employeeData
INNER JOIN Employee ON Employee.employeeId = employeeData.employeeId
WHERE rowNumAlias BETWEEN ? AND ?

其中参数rowNumAlias可以是1到100之间的任何整数

在具有100万条记录的sql服务器数据库上,此查询大约需要7秒钟。 有什么方法可以使查询执行时间最短?

您可以这样尝试:

SELECT * FROM (
SELECT (SELECT row_number() OVER (ORDER BY e2.NAME ASC) FROM Employee e2 WHERE Employee.employeeId = E2.employeeId) rowNumAlias,
    ,Employee.employeeId
    ,Employee.NAME
FROM Employee 
) e3 WHERE e3.rowNumAlias BETWEEN ? AND ?

您可以尝试为此使用CTE。

;WITH employeeData as 
(
    SELECT row_number() OVER (ORDER BY Employee.NAME ASC) rowNumAlias,
    employeeId,
    NAME
    FROM Employee
)
SELECT employeeData.rowNumAlias,
employeeData.employeeId,
employeeData.NAME
FROM employeeData
INNER JOIN Employee ON Employee.employeeId = employeeData.employeeId
WHERE rowNumAlias BETWEEN ? AND ?

如果您使用的是SQL Server 2012+,则可以使用ORDER BY ... OFFSET ... FETCH ...语法进行分页:

SELECT EmployeeId, Name    
FROM Employee
ORDER BY Employee.Name ASC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY

OFFSET指定要跳过的行数和FETCH NEXT要获取的行数。 请参阅文档

在早期版本中,您应该可以通过使用公用表表达式来获得更好的性能(使用适当的索引,此查询看起来像根据我的执行计划在缩短原始时间的情况下执行):

;With cte (rownum, employeeid, name)  as (
    SELECT 
       rownum = row_number() OVER (ORDER BY employee.name ASC),
        employeeid, 
       name
    FROM employee
)

SELECT rownum, employeeid, name
FROM cte
WHERE rownum BETWEEN ? AND ?;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM