SQL Server 2008稀疏列确定列的转化
2008-12-12 10:14:34 来源:WEB开发网 USE AdventureWorks
GO
SET NOCOUNT ON
DECLARE @SQL VARCHAR(MAX)
CREATE TABLE #SPARCEPERCENTAGE (
DATATYPE VARCHAR(50),
PRCENT INT)
INSERT INTO #SPARCEPERCENTAGE
SELECT 'bit', 98
UNION ALL
SELECT 'tinyint', 86
UNION ALL
SELECT 'smallint', 76
UNION ALL
SELECT 'int', 64
UNION ALL
SELECT 'bigint', 52
UNION ALL
SELECT 'real', 64
UNION ALL
SELECT 'float', 52
UNION ALL
SELECT 'smallmoney', 64
UNION ALL
SELECT 'money', 52
UNION ALL
SELECT 'smalldatetime', 64
UNION ALL
SELECT 'datetime', 52
UNION ALL
SELECT 'uniqueidentifier', 43
UNION ALL
SELECT 'date', 69
CREATE TABLE #TMP (
CLMN VARCHAR(500),
NULLCOUNT INT,
DATATYPE VARCHAR(50),
TABLECOUNT INT)
SELECT @SQL = COALESCE(@SQL,'') + CAST('INSERT INTO #TMP Select ''' + TABLE_SCHEMA + '.' + REPLACE(TABLE_NAME,'''','''''') + '.' + COLUMN_NAME + ''' AS Clmn, count(*) NullCount, ''' + DATA_TYPE + ''', (Select count(*) FROM ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']) AS TableCount FROM ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] WHERE [' + COLUMN_NAME + '] IS NULL ;' + CHAR(13) AS VARCHAR(MAX))
FROM INFORMATION_SCHEMA.COLUMNS
JOIN sysobjects B
ON INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = B.NAME
WHERE XTYPE = 'U'
--AND INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = 'Person'
--AND INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = 'Contact'
EXEC( @SQL)
SELECT A.CLMN,
A.NULLCOUNT,
A.TABLECOUNT,
A.DATATYPE,
(A.NULLCOUNT * 1.0 / A.TABLECOUNT) NULLPERCENT,
ISNULL(B.PRCENT,60) * .01 VALUEPERCENT
FROM #TMP A
LEFT JOIN #SPARCEPERCENTAGE B
ON A.DATATYPE = B.DATATYPE
WHERE A.NULLCOUNT > 0
AND (A.NULLCOUNT * 1.0 / A.TABLECOUNT) >= ISNULL(B.PRCENT,60) * .01
ORDER BY NULLPERCENT DESC
DROP TABLE #TMP
DROP TABLE #SPARCEPERCENTAGE
这是针对AdventureWorks数据库运行时输出结果的一个实例。NullPercent列应该与ValuePercent比较以确定使用稀疏列是否有优势。正如你在第一行所看到的,Sales.SalesOrderHeader列注释的所有行都是空值,因此NullPercent是100%而ValuePercent是60%,所以使用稀疏列是个很不错的选择。注意:上面的查询限制了输出结果,只显示了哪些列会获得使用稀疏列的优势。
图一
在以上代码中,我注释了两行,如下所示,可以用这两行来限制每一次搜索只在一张表中进行。只需取消这些模式并且在你想分析的表上更改模式和表的值。
--AND INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = 'Person'
--AND INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = 'Contact'
如果你尝试运行SQL 2000上的脚本,你就需要把Varchar(MAX)改成 Varchar(8000),并且极有可能在一张表接着一张表的基础上搜索。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接