【问题标题】:SQL optimization on ORDER BY clause on varchar(max) columnvarchar(max) 列上 ORDER BY 子句的 SQL 优化
【发布时间】:2014-11-27 10:02:19
【问题描述】:

我们的 C# 应用程序使用 SQL 数据库来相互匹配表。我们有一个包含大约 100 万行的表。大多数数据类型是 varchar(900) 及以下。虽然有些列是作为 varchar(max) 类型导入的。用户可以通过 C# 应用程序查看包含 100 万条记录的整个表。为了减少在本地系统上使用的内存量,我们使用分页算法。例如。我们在内存中加载了两个 +- 15.000 行的数据表。当用户滚动过去这些页面时,最远的页面将使用数据库表中的新数据进行更新,这样您就可以拥有非常大的表而不会遇到内存问题。

我们使用行号从数据库表中获取特定数据。检索数据的查询如下所示:

;WITH selectRows AS(SELECT *, row=ROW_NUMBER() OVER(ORDER BY myColumn) FROM myTable)
SELECT * FROM selectRows WHERE row BETWEEN 0 AND 15000;

在小桌子上,这对性能来说不是什么大问题。但是对于大型表,当我们对没有索引的列(例如 varchar(max) 列)进行排序时,它将执行非常慢。正如预期的那样,对具有索引的列进行排序的速度非常快。是否可以在 varchar(max) 列上对大表进行排序。 如果我的问题有任何解决方案,它应该能够在 SQL Server 2005、2008、2012 版本上运行。

【问题讨论】:

    标签: sql sql-order-by


    【解决方案1】:

    对 varchar max 使用粗过滤器,示例取自 here。这实际上是您的 varchar max 列的简化版本。由于您仅将其用于订购,因此对于您的目的应该足够了。

    CREATE SCHEMA [20090501_max]
    CREATE TABLE t_bigdata (
    id INT NOT NULL PRIMARY KEY,
    value NVARCHAR(MAX),
    value_index AS CAST(value AS NVARCHAR(450))
    )
    GO
    CREATE INDEX IX_bigdata_value ON [20090501_max].t_bigdata(value_index)
    

    【讨论】:

    • 我尝试了一些不同的方法。我在创建表时创建了一个 value_index 列。该列有一个非聚集索引(因为我已经在 ID 列上有一个聚集索引)。我使用“UPDATE myTable SET value_index = myColumn”更新此列。排序工作非常快。但是,当我使用来自另一个需要排序的 varchar(max) 列的新数据更新 value_index 列时,填充它仍然需要相当多的时间(> 1 分钟)。不过感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多