WEB开发网
开发学院数据库MSSQL Server SQL Server 2008稀疏列确定列的转化 阅读

SQL Server 2008稀疏列确定列的转化

 2008-12-12 10:14:34 来源:WEB开发网   
核心提示: USE AdventureWorksGOSET NOCOUNT ONDECLARE @SQL VARCHAR(MAX)CREATE TABLE #SPARCEPERCENTAGE (DATATYPE VARCHAR(50),PRCENT INT)INSERT INTO #SPARCEPER

   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%,所以使用稀疏列是个很不错的选择。注意:上面的查询限制了输出结果,只显示了哪些列会获得使用稀疏列的优势。

SQL Server 2008稀疏列确定列的转化

图一

在以上代码中,我注释了两行,如下所示,可以用这两行来限制每一次搜索只在一张表中进行。只需取消这些模式并且在你想分析的表上更改模式和表的值。

--AND INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = 'Person'

--AND INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = 'Contact'

如果你尝试运行SQL 2000上的脚本,你就需要把Varchar(MAX)改成 Varchar(8000),并且极有可能在一张表接着一张表的基础上搜索。

上一页  1 2 

Tags:SQL Server 稀疏

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接