Sql server SQL Server在nvarchar字段上应用MAX和BETWEEN函数
我们有一个运行在SQL Server 2000 DBMS上的数据库,日期和时间存储为nvarchar字段日期存储为shamsi日期,如“1393/02/24”,时间存储为“13:07”。应用程序很旧,查询在应用程序中硬编码,因此更改数据类型不是一个可行的选项。这些表格包含数十万条记录。 此系统上的示例查询如下所示:Sql server SQL Server在nvarchar字段上应用MAX和BETWEEN函数,sql-server,date,max,between,nvarchar,Sql Server,Date,Max,Between,Nvarchar,我们有一个运行在SQL Server 2000 DBMS上的数据库,日期和时间存储为nvarchar字段日期存储为shamsi日期,如“1393/02/24”,时间存储为“13:07”。应用程序很旧,查询在应用程序中硬编码,因此更改数据类型不是一个可行的选项。这些表格包含数十万条记录。 此系统上的示例查询如下所示: SELECT C1, C2, ... FROM tbl1 WHERE ReferenceDate = '1393/02/17' AND PrintDate IN (SELECT M
SELECT C1, C2, ...
FROM tbl1 WHERE ReferenceDate = '1393/02/17'
AND PrintDate IN (SELECT MAX(PrintDate) FROM tbl2 WHERE Code = tbl1.Code)
还有一些查询的PrintDate介于
这些查询深度低于6或7个连接级别,因此递归级别较高
查询也不是以最有效的方式编写的,但由于它们是硬编码的,并且应用程序是一个没有可用文档的遗留应用程序,因此从应用程序代码应用对查询的更改非常困难
现在的问题是,这个系统运行得非常慢,一些报告执行时间超过30秒,一些超时,大约90%的执行时间被保存为nvarchar的这些日期字段的排序操作和转换操作占用,我对这些字段应用了一些索引,但没有真正起到帮助
有什么方法可以提高这些查询的性能吗?将数据库移动到较新版本的SQL Server(如2012)是否会提高性能?我执行以下操作以提高查询性能: 检查索引 如果需要,更新统计数据-与DBA讨论此问题 查看查询计划,特别是估计行数与实际行数 尝试使用执行相同作业的不同查询并出错。
我要尝试的第一件事是使用CTE或Temp表和索引,并使用JOIN而不是IN。欢迎使用SO。如果存储为字符串的日期不理想,您可能会得到更有用的答案,但如果存储为'YYYY/MM/DD',则是次好的选择。正如Gabe所说,了解数据库的日期-时间数据类型并使用一个。然后索引它。