SQLSERVER 数据库中常见的问题(避免入坑)
来源:http://www.tudoupe.com时间:2022-04-16
此日志将教您如何检测典型的数据库错误 。
分布式查询
如果您使用 OpenROWSET 和 OpenDATSOURSE 访问数据, 您必须激活特设分发查询。 它默认被禁用。 要启用特设分发查询, 请使用以下命令 :
列排序规则与数据库默认值不符 。
排序规则管理字符串排序和比较。排序通常不是问题,因为它与顺序要求没有冲突。它可能不是按照你喜欢的方式安排的但不会导致错误。在比较数据时会产生实际问题。比较可以多种方式进行。这可能只是比较句子所在之处。它也可以是连接参数的比较。如果数据库中的列不符合数据库的默认排序标准,你会遇到麻烦的
如果在现有表格中添加新的列,或使用字符串栏创建新表格而不指定排序规则,则使用数据库的默认排序规则。如果随后准备与现有列相关的查询(有不同的排序标准),则会收到规则冲突错误。
在这里要清楚一点,我不建议每个字符串列都有与数据库默认排序规则相符的排序规则。相反,我建议当它不同时,应该有令人信服的理由。有几个成功的数据库。排序规则从未被开发者考虑过 。在这种情况下,每个字符串列的排序规则最符合数据库的默认排序规则。
列数据类型中的数值对数值
整数 - 使用值而不是整数
我当时在数据库里工作我来到了一个不寻常的景象。许多栏目指定为数字(7,0),数字(9,0)等等。似乎正在努力向数据库提供可能适用于广泛数据的最精确的定义。这是我第一次看到这样的事我立刻开始寻找解释变小了吗?快点?更好的?
贮存
我们的储存能力正在因使用一个非常精确和明确界定的数字而耗尽。而不是减少了它。数字(或小数)从1到9不等,需要5字节。因此,数字10-19需要九个字节。与多个整数比较时:
因此,我们失去了包括这些数据的每个行和指数的存储空间。
在MSDN中,有一个Int参考和数值/十进制参考。
性能#1
当 SQL 服务器被要求执行数学函数 (+,-,*/) 时, 它返回错误 。它使用一套既定规则确定产出类型。然后将这些参数转换成这种类型(参照适当的子集)。请参见此文本中的小数点位。因此,在许多情况下,可能会有未检测到的从整数转换为数数的转换 。因此,人们可以设想,我们可以通过将实地指定为数值而非星图来改进我们的业绩。
让我们在测试时隐形一点:
样本结果:
我们可以在第二个试验计划中看到隐藏变换的例子:
带有隐藏转换的数字/整数转换 :
因此,如果我们有一个以浮动点值操作的整数(最后一个例子),在整数参数中增加一个简单的强制转换即可使性能与两个数字相匹配,这意味着将数据保存到一个数字(7,0)没有好处。
性能 #2
自动参数化是另一种可能的性能影响。当您向 SQL 服务交付非参数 SQL 语句时,进行了自动参数化。服务器决定并具体说明这些参数的种类(以便作为非参数查询的魔力的一部分重新利用计划)。我似乎无法发现周围的任何东西照片来自Flickr用户pic.发动机被记录为处理任何非十进制值9位数或少于9位数的整数。这就需要内部化、非平行 SQL 语句等等。如果表格定义中无法使用数字 (, 0) 类型, 将会由于自动参数整数的隐藏转换而面临性能后果( 自动参数整数) 。,0)字段。
仿佛这还不够可怕根据SQL服务器的同一页,SQL服务器认为整个数字比数字和小数类型更准确。它没有解释为什么该文件如此努力地与我们分享这一信息。然而,通常,当有人试图在报纸上指出类似的东西时, 这样做是不对的, 但这样做是正确的。我会有点紧张,也有一种倾向是,它们注重“推荐”的做法(使用 " int " )。
SQL 7 优化和参数化
总结
最后,使用 Numeric (*,0) 占用更多空间, 无法为可见转换带来明显的好处, 而且如果服务器上运行非参数 SQL 交易, 可能会伤害您 。
列名问题
列表(和名称)不得包括任何空格或其他无效字符。这被认为是不道德的。因此,必须使用你的名字前后的方括号。方括号使阅读和理解代码更加困难。查询还将突出列和表格,其名称以数字表示(如下文所示)。大多数时候,当一个数字出现在清单中时,这是一个非标准化的数据库。此规则有例外,因此,并非所有出现的问题都必须解决。
纠正方法:如果这是一个数字问题,您可能需要调整数据库结构,以容纳额外的表格。例如,如果您有一个学生等级表,其栏目如下:(学生一年级,一年级,二年级,三年级,四年级)您应该用标准等级取代( 学生等级、 等级、 身份识别符) 。每个孩子在这个表格中都有许多行(每年级一行)。您必须包含一个标识栏来解释实现的目标(11月10日考试、阅读报告等)。
如果这是一个特殊的特点问题,然后该列的名称应该更改 。删除字词或短语中的所有空格、数字和符号。执行此操作时,确定一个检查点,检查所有使用这一方法的地区。这可能包括过程、真菌、观点、索引、前端代码等等。
文本或 nText 数据类型列
SQL2005之前的 SQL 服务器版本,文本、正文或图片数据类型是存储大量数据的唯一方法。为了取代这些数据类型,SQL2005采用了其他数据类型。它还使得能够使用所有相关的字符串处理功能。视表格大小而定,将数据类型改为新的SQL2005+对应数据应非常简单和简单。那么,为什么要等呢?现在转换数据类型。
将数据类型修改为 SQL2005+。 文本应该转换为 varchar( 最大), ntext 到 nvarchar( 最大), 图片应该转换为 valbinary( 最大) 。
带有浮动点数据类型的列
这也许看起来很严酷,但并不总是如此。 但在大多数情况下,应该避免使用浮动点数据类型。 可悲的是,浮动点(和真实)数据类型是近似数据类型,这可能导致重大四舍五入的错误。
修改数据类型( 或代码) 以使用需要的精确度和比例的小数点。 检查您正在使用的数据并决定您需要的准确度和大小 。
图像数据类型列
SQL2005之前的 SQL 服务器版本,文本、正文或图片数据类型是存储大量数据的唯一方法。为了取代这些数据类型,SQL2005采用了其他数据类型。它还使得能够使用所有相关的字符串处理功能。视表格大小而定,将数据类型改为新的SQL2005+对应数据应非常简单和简单。那么,为什么要等呢?现在转换数据类型。
将数据类型修改为 SQL2005+。 文本应该转换为 varchar( 最大), ntext 到 nvarchar( 最大), 图片应该转换为 valbinary( 最大) 。
数据库整理
当您的用户数据库的排序标准与 TempDB 的标准不符时,你可能有麻烦在TempDB中,编制临时表格和表格变量。当您不定义临时表格表格变量和字符串列的排序规则时,他们将继承TembB的默认排序规则。每次比较和(或)添加临时变量或表格变量时,你可能会遇到某种规则的冲突
在正常情况下,最好所有分类规则都吻合。TampDB、模型(用于创建新数据库)、用户数据库和所有字符串列(varchar、 nvarchar、char、 nchar、 textt、 ntext)都包括在内。
如何解决这个问题:这个问题有许多解决办法。长期答案是更新数据库的默认排序规则(这将影响新的字符串列 )。更改现有列的排序标准。或者,任何生成临时变量或表格变量的代码都可以修改。定义您字符串栏的排序规则您可以硬代码排序规则, 或者使用数据库的默认排序规则 。
前任:
# 任何名称为YouWish( Id Int, 眼镜 VarChar( 20) ) 的星座 e Database_ Default )
十进制大小问题
使用小数(或数字)数据时,您应该检查精确度和小数位数 。如果不这样做,精确度是18十进制位数默认设定为零 。当小数点为零时,不能存储小数。如果您不想保存小数,应采用几种数据类型,例如,有一个链接,一个字,一个小的,一个小的,一个小的,例如。
转发记录
住房和环境评估方案表格和传送记录是一个重大的、利用不足的绩效问题。
为解决这一问题,您必须履行以下职责:
以表内付款表单独付款表
碎片化索引
如果您做大量更新、插入和删除,您的索引将随着时间的流逝而支离破碎。
修复碎片有两种方法:重新组织指数和重新组织指数。
除非您设置 ONLINE = ON, 重组是在线活动, 但重建不是。
ONLINE = ON仅对SQL服务器业务版有效。
ALTER INDEX indexName ON tableName REORGANIZE;
ALTER INDEX indexName ON tableName REBUILD;
缺少外键
数据库围绕参考文献进行。有了完美无瑕的前端编码 你就可以建立一个惊人的数据库用你的数据做正确的事情 100%的时间。但是,写代码很难。很难!你的数据通常是你最宝贵的资产你必须用所有可用的技术来捍卫它。参考资料的完整性是数据保护的核心。这是什么意思?这意味着你的数据永远不能丢失!
测试将查找列名中带有ID的列, 且不在主密钥或外部密钥约束中。 这通常表示没有限制, 但情况并非总是如此 。
如何修补:乍一看,解决办法似乎是直截了当的。只需声明您的外键,对吗?好吧,这不是那么简单。你看,可能有正在使用的代码。从适当的表格中删除所有所需的数据。如果您的代码在错误的顺序中从适当的表格中删除数据,,然后将发生引用限制错误。在更新和插入数据时也可能出现类似问题。当你有引用约束时,至关重要的是,必须按正确的顺序完成一切工作。
仅
恢复或重新添加数据库时最常见的情况是数据库用户成为孤立的用户。
这基本上表示数据库用户与 sql 服务器登录无关。
解决这一问题的脚本。请参阅: https ://dba.stackexchange.com/questions/12817/is-there-a-shorthand-way-to-auto-fix-all-orphaned-users-in-an- sql-server-2008
相关新闻
- 2023-04-16 2台电脑怎么共享(2台电脑怎么共享
- 2023-04-16 主板检测卡代码(电脑主板检测卡代
- 2023-04-16 dnf未响应(dnf未响应老是上不去)
- 2023-04-16 ppoe(pppoe拨号上网)
- 2023-04-16 网速不稳定(网速不稳定是路由器的
- 2023-04-16 wds状态(Wds状态成功)
- 2023-04-16 光标键(光标键不动了怎么办)
- 2023-04-16 电脑提速(电脑提速100倍的方法)
- 2023-04-16 切换用户(切换用户怎么切换回来
- 2023-04-16 数据包是什么(产品数据包是什么
|
|
|
|
|
|
|
|
|
|