如何从包含大量列的表中提高选择查询的性能

时间:2016-11-24 15:04:50

标签: sql sql-server

我有一张几乎有100列的表格。大多数列的类型为Nvarchar(50)

当我按查询选择行时,需要很长时间,具体取决于行数。现在,该表包含250,000行。执行时需要一分钟才能获得所有行:

SELECT * FROM Table1

我尝试添加索引,但它并没有缩短时间。

如何以更好的方式构建此表,以便查询的执行时间更短?

我正在使用SQL Server 2014。

4 个答案:

答案 0 :(得分:0)

尝试通过将数据类型调整为最低要求来减小表的大小。不要在int足够的情况下使用bigint,如果没有使用Unicode文本并且将数据长度保持在最低要求,则不要使用Unicode类型。如果存在大量Null的nvarchar(50)列,请在列属性中将Sparse设置为True以减少必须加载的数据量。

答案 1 :(得分:0)

您可以使用包含索引。如果确保include只包含您选择的列,则SQL Server可以在索引上独占运行查询,从而提高性能。

例如表......

CREATE TABLE Example (
    Column1 INT,
    Column2 INT,
    --....
    Column100 INT
)

...对列的子集进行查询:

SELECT Column1, Column2, Column3
WHERE Column1 > 1000

您可以创建索引

CREATE INDEX IX_Example
    ON Example(Column1)
    INCLUDE (Column2, Column3)

由于SQL Server可以从索引中获取所需的所有信息,因此它不会触及表。但是,您需要更多的索引空间而不包含,因为表中的数据现在已经冗余地存储在索引中。

答案 2 :(得分:0)

您的执行计划会给您答案,检查

答案 3 :(得分:0)

如果您正在使用'SELECT * FROM Table1',那么Indexes将没有任何区别。 SQL需要从Disk到Buffer读取整个表。如果您无法远离选择所有列,那么请查看最常返回的记录集,即2016年的事务。如果是这种情况,那么您可以引入分区(Enterprise),或者如果您使用的是SQL Standard创建一个仅包含2016年记录的“过滤覆盖索引”(包括所有列)。如果您能承受额外的更新开销,那么SQL将使用较小的索引来满足大量用户需求。