2016-12-06 31 views
1

有这个SQL command sp_tableoption用来:sp_tableoption行内行为

设置选项值用户定义的表。可以使用sp_tableoption来控制具有varchar(max),nvarchar(max),varbinary(max),xml,text,ntext,image或大型用户定义类型列的表的行内行为。

什么是排内行为?

+2

https://technet.microsoft.com/zh-cn/library/ms189087(v=sql.105).aspx –

回答

1

感谢@Prdp我做了一些研究

TL; DR;如果你有一个大的表(长文本列),并且你一直没有使用select *,那么你最好将text in row设置为一些不大的值。

exec sp_tableoption N'MyTable', 'text in row', '260' 

在SQL数据被保存in pages默认的8Kb,每页拥有更多记录 - 更快的查找会(260将使31条记录每页这是不到5倍(LOG 2(31)=〜4.95)) 。

旁注:下面的SQL将让你行的表的平均长度:

declare @table nvarchar(128) 
declare @sql nvarchar(max) 
set @table = '[Schema].Table' 
set @sql = 'select AVG((0' 
select @sql = @sql + ' + isnull(datalength(' + name + '), 1)' 
     from sys.columns where object_id = object_id(@table) 
set @sql = @sql + ')) from ' + @table 

PRINT @sql -- in case you will fail to set table variable properly ;) 
exec sp_executesql @SQL 

What in-row means是实际的潜在长记录将在页面中保持与其他行的期望,当它看起来像select *它会尽可能快......所以在你做任何事情的情况下,你应该把这个设置设置为大数字〜7k

如果这个设置有值时,行大小达到这个三字节shold它将被移动和指针将放在代替 - 这反过来将增加每页记录数=使查找更快...

要检查什么是它设置为运行以下查询:

select name, text_in_row_limit from 
sys.tables 

希望这可以为您节省一些时间。