【发布时间】:2014-11-10 13:16:53
【问题描述】:
我们有一个在 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 MAX(PrintDate) FROM tbl2 WHERE Code = tbl1.Code)
还有一些查询的 PrintDate BETWEEN ...
这些查询深度低于 6 或 7 级连接,因此递归级别很高。
查询也不是以最有效的方式编写的,但由于它们是硬编码的,而且应用程序是一个遗留的应用程序,可用文档为零,因此从应用程序代码对查询应用更改真的非常困难。
现在的问题是这个系统运行速度非常慢,一些报告需要 30 多秒才能执行,并且一些超时,大约 90% 的执行时间被这些日期字段上的排序操作和转换操作消耗为保存为nvarchar,我在这些字段上应用了一些索引,但它并没有真正帮助。
有什么办法可以提高这些查询的性能吗?将数据库迁移到 2012 等较新版本的 SQL Server 会提高性能吗?
【问题讨论】:
-
欢迎来到 SO。您可能会在dba.stackexchange.com 中获得更多有用的答案
-
日期存储为字符串并不理想,但如果它们存储为 'YYYY/MM/DD',那就是下一个最佳选择。我会确保正在使用索引。
-
正如 Gabe 所说,了解数据库的日期时间数据类型并使用其中一种。然后索引它。
标签: sql-server date max between nvarchar