varchar(max)列上ORDER BY子句的SQL优化

时间:2014-11-27 10:02:19

标签: sql sql-order-by

我们的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版本上运行。

1 个答案:

答案 0 :(得分:3)

对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)