如何提高 SQL 服务器中大数据的提取速度
How to increase fetching speed of large data in SQL Server
以下是我的查询,它需要 2:26 分钟从 SQL Server 2008 R2 数据库
中获取 9'619'516 条记录
查询:
SELECT
SERVERID, MSGID, BPID, FLOWID, FSID, FSSTEP,
MESSAGETYPEID, MESSAGESTRING, USERBLOB, USERCODE,
CREATEDATE, CREATETIME, OBJECTLEVEL, CATEGORY,
USERKEY1, USERKEY2, VERSIONKEY, STATUSCODE, SEVERITY,
EXTENSION, PROJECTKEY, BLOBEXISTS, ROOTFSID,
FLOWREQUESTID, FILELOCATION, RUNID,
TEMP_MGXPI4_1.DateTimeObject, TEMP_MGXPI4_1.TEMP_ROW_NUM
FROM
(SELECT
SERVERID, MSGID, BPID, FLOWID, FSID, FSSTEP,
MESSAGETYPEID, MESSAGESTRING, USERBLOB, USERCODE,
CREATEDATE, CREATETIME, OBJECTLEVEL, CATEGORY,
USERKEY1, USERKEY2, VERSIONKEY, STATUSCODE,
SEVERITY, EXTENSION, PROJECTKEY, BLOBEXISTS, ROOTFSID,
FLOWREQUESTID, FILELOCATION, RUNID,
REPLACE(CONVERT(NVARCHAR(10),CREATEDATE, 126),'-','') + CONVERT(NVARCHAR(50),CREATETIME) AS DateTimeObject,
ROW_NUMBER() OVER(ORDER BY CREATEDATE DESC, CREATETIME DESC, MSGID DESC) AS TEMP_ROW_NUM
FROM
IFS_ACTLOG
WHERE
PROJECTKEY = 'Project1' AND ROOTFSID = 1) AS TEMP_MGXPI4_1
SQL 查询的服务器执行计划:
很可能,您的表现是基于移动大量数据。
但是,从性能的角度来看,您的查询是:
SELECT . . .,
ROW_NUMBER() OVER (ORDER BY CREATEDATE DESC, CREATETIME DESC, MSGID DESC) AS TEMP_ROW_NUM
FROM IFS_ACTLOG
WHERE PROJECTKEY = 'Project1' AND ROOTFSID = 1
此查询建议在 (PROJECTKEY, ROOTFSID, CREATEDATE DESC, CREATETIME DESC, MSGID)
上建立索引。
也就是说,即使查询运行得更快,移动到数据库之外的数据量仍然需要时间来处理。
以下是我的查询,它需要 2:26 分钟从 SQL Server 2008 R2 数据库
中获取 9'619'516 条记录查询:
SELECT
SERVERID, MSGID, BPID, FLOWID, FSID, FSSTEP,
MESSAGETYPEID, MESSAGESTRING, USERBLOB, USERCODE,
CREATEDATE, CREATETIME, OBJECTLEVEL, CATEGORY,
USERKEY1, USERKEY2, VERSIONKEY, STATUSCODE, SEVERITY,
EXTENSION, PROJECTKEY, BLOBEXISTS, ROOTFSID,
FLOWREQUESTID, FILELOCATION, RUNID,
TEMP_MGXPI4_1.DateTimeObject, TEMP_MGXPI4_1.TEMP_ROW_NUM
FROM
(SELECT
SERVERID, MSGID, BPID, FLOWID, FSID, FSSTEP,
MESSAGETYPEID, MESSAGESTRING, USERBLOB, USERCODE,
CREATEDATE, CREATETIME, OBJECTLEVEL, CATEGORY,
USERKEY1, USERKEY2, VERSIONKEY, STATUSCODE,
SEVERITY, EXTENSION, PROJECTKEY, BLOBEXISTS, ROOTFSID,
FLOWREQUESTID, FILELOCATION, RUNID,
REPLACE(CONVERT(NVARCHAR(10),CREATEDATE, 126),'-','') + CONVERT(NVARCHAR(50),CREATETIME) AS DateTimeObject,
ROW_NUMBER() OVER(ORDER BY CREATEDATE DESC, CREATETIME DESC, MSGID DESC) AS TEMP_ROW_NUM
FROM
IFS_ACTLOG
WHERE
PROJECTKEY = 'Project1' AND ROOTFSID = 1) AS TEMP_MGXPI4_1
SQL 查询的服务器执行计划:
很可能,您的表现是基于移动大量数据。
但是,从性能的角度来看,您的查询是:
SELECT . . .,
ROW_NUMBER() OVER (ORDER BY CREATEDATE DESC, CREATETIME DESC, MSGID DESC) AS TEMP_ROW_NUM
FROM IFS_ACTLOG
WHERE PROJECTKEY = 'Project1' AND ROOTFSID = 1
此查询建议在 (PROJECTKEY, ROOTFSID, CREATEDATE DESC, CREATETIME DESC, MSGID)
上建立索引。
也就是说,即使查询运行得更快,移动到数据库之外的数据量仍然需要时间来处理。