【问题标题】:SQL Server applying MAX and BETWEEN functions on nvarchar fieldSQL Server 在 nvarchar 字段上应用 MAX 和 BETWEEN 函数
【发布时间】: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


【解决方案1】:

我执行以下操作来提高查询性能:

  1. 检查索引
  2. 如果需要,更新统计信息 - 与 DBA 讨论此问题
  3. 查看查询计划,尤其是估计的行数与实际行数
  4. 尝试使用不同的查询执行相同的工作并出错。

我会尝试的第一件事是使用 CTE 或带有索引的临时表并使用 JOIN 而不是 IN。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2019-05-08
    • 2016-09-24
    相关资源
    最近更新 更多