前言:我正在对“旧”PHP / SQL Server 2012系统进行维护,目标是提高整体性能。
我立刻意识到数据库有很多“怪癖”,但我会遵循一个策略,我决定开始更正列的类型,特别是我注意到包含文本的列是ALL nvarchar(max),实际上作为一个应用程序Web,其中一些列是正确的,许多不是。 我正在尝试编写一个脚本,允许我将“varchar”设置为不包含unicode文本的列的数据类型。
我做了几个没有结果的研究,我找到的唯一解决方案就是将插入到varchar列的表中并验证不会出错..有一个更智能的解决方案吗?
答案 0 :(得分:0)
来自我的评论:
将
NVARCHAR
更改为VARCHAR
会缩小尺寸,但不会 对性能有很大影响。你甚至可能陷入深深的麻烦 有特殊字符,突然返回???特别 处理Web应用程序时,您应该保持跨文化和 记住语言......
除此评论之外,这里还有一个查询,您可以使用它来获取大量元数据
SELECT c.DOMAIN_CATALOG
,c.TABLE_SCHEMA
,c.TABLE_NAME
,c.COLUMN_NAME
,c.DATA_TYPE
,c.CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS AS c
WHERE c.DATA_TYPE IN ('varchar','nvarchar')
ORDER BY c.CHARACTER_MAXIMUM_LENGTH -- (-1 indicates "MAX")
一般情况下:检查您可以通过INFORMATION_SCHEMA
检索的元数据。
您的评论
有些表有6000万行,我认为使用不必要的nvarchar而不是varchar可能会影响数据的权重
嗯,有了这么大的表,纯粹的大小(页面加载,disc-io)很重要。但其他尝试(指数,次优结构......)将产生更深层次的影响......
您可以查看以下内容:
DECLARE @tbl TABLE(Some16Bit NVARCHAR(MAX),Some8Bit VARCHAR(MAX));
INSERT INTO @tbl(Some16Bit) VALUES(N'plain'),(N'Using russian: слов');
UPDATE @tbl SET Some8Bit=CAST(Some16Bit AS VARCHAR(MAX));
SELECT *
,CASE WHEN Some16Bit<>Some8Bit THEN 'Needs NVARCHAR' ELSE 'OK' END AS CheckNVARCHAR
FROM @tbl
结果
Some16Bit Some8Bit CheckNVARCHAR
-----------------------------------------------------
plain plain OK
Using russian: слов Using russian: ???? Needs NVARCHAR