我有一张几乎有100列的表格。大多数列的类型为Nvarchar(50)
。
当我按查询选择行时,需要很长时间,具体取决于行数。现在,该表包含250,000行。执行时需要一分钟才能获得所有行:
SELECT * FROM Table1
我尝试添加索引,但它并没有缩短时间。
如何以更好的方式构建此表,以便查询的执行时间更短?
我正在使用SQL Server 2014。
答案 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将使用较小的索引来满足大量用户需求。