在当今的信息技术领域,对数据库的熟练掌握已经从“锦上添花”变成了“必不可少”。SQL数据库有其独特的需求和限制,与其他技术截然不同。因此,一些程序员在理解所有概念时遇到了困难。对于其他人来说,他们只是学习了足够的知识以避免下一个潜在的问题。这是为什么呢?SQL提供了结构化语言的外观和感觉,但每个数据库都有自己的特点。在常规的编程环境中,一个值的输出每次都会相同。在SQL数据库中,有许多因素会影响每个请求的决策。例如,随着时间的推移或由于外部影响,找到数据的最终路径可能会发生变化。要取得成功,需要科学和艺术的结合。以下部分概述了一些避免潜在陷阱的技巧。
这听起来可能是显而易见的,但对开发者来说,没有计划或救生索就跳进去是一条非常常见的路径。花时间学习语言。查看每个关键字及其用途。保持对社区贡献的洞察力和新产品发布的警惕。每个新版本的SQL Server都带来了增加的速度、可见性和选项。MSDN有一个涵盖基础知识的极好图书馆。
权力越大,责任越大。程序员倾向于对用户定义的函数(UDFs)感到非常舒适,因为它们模仿了其他语言中发现的范式。输入数据,输出数据。不幸的是,过度使用UDFs可能会让开发者陷入麻烦,因为SQL是一种解释性语言,意味着没有编译代码;因此,在大规模或高需求情况下可能会效率低下。此外,在WHERE子句中使用UDFs会迫使数据逐行比较,这可能会非常慢且内存密集。
SQL Server提供了两个临时存储表数据的区域。由于每个选项都有其优势,因此两者都存在。不幸的是,在某些情况下,使用错误的选项可能会使内存或CPU密集。例如,由于表变量的性质,不建议在此选项中存储大量记录。此外,使用更大、更健壮的临时表选项可能会为简单解决方案在系统上造成不必要的负载。
这对所有开发者来说都是必需的。一旦学习了基本关键字(例如SELECT、FROM、WHERE等),程序员应该退后一步,了解隔离级别如何影响数据收集。在事务性世界中,根据请求的时间,所有数据并不平等。尽管在新版本中级别有所增加,但理解COMMITTED和UNCOMMITTED之间的区别至关重要。此外,了解NOLOCK这个常用关键字如何影响这一讨论也很重要。
与数据库的工作不仅仅包括编写SQL语句或存储过程。SQL Server使用各种内部机制,如索引和优化统计信息,来确定请求数据的最佳路径。一旦确定,SQL Server会缓存路径以加快未来请求的速度。能够阅读这些计划对于解决速度和性能问题至关重要。在许多情况下,当答案不明显时,计划会讲述真实的故事。
参数嗅探始于SQL Server为存储过程构建执行计划。在构建这个计划时,它使用它给出的任何初始参数。在某些情况下,如果数据是一个不寻常的案例,SQL会缓存一条坏的数据路径。此外,开发者也可以通过在参数中增加数据,但仍然在SQL语句中使用该参数来创建问题。这可能会在构建计划时混淆数据库。