简述数据定义语言的功能及其包括的主要SQL语句。

数据定义语言(DDL)主要做什么? 增强了CLR集成、ServiceBroker、全文搜索等功能。
简单来说就是建库、创建表、修改表、删除表、创建索引、删除索引。

SQL的定义功能是什么

说实话,当我第一次接触数据库时,SQL就像一个黑匣子。
但十年后,这些功能慢慢被瓦解、破坏。
你列出的点都在那里了,但我想谈谈在更具体的场景下如何实现这些功能。

例如,给我印象最深的数据访问操作是2 008 年为一家电信公司做的一个项目。
他们的旧系统使用的是Access,随着数据量的增加,它崩溃了。
后来改用SQL Server,写了一个脚本批量插入用户数据。
使用 BULK INSERT 的速度至少比单独使用 INSERT 快十倍。
我在调试脚本的时候,半夜在酒店盯着profiler看执行计划,结果发现索引没有设置正确,导致查询极其缓慢。
这让我意识到,看似简单的插入和更新背后,需要了解数据库的一些物理存储原理。

就查询功能而言,我遇到了更离谱的事情。
2 01 5 年有一个电商客户。
他们使用 SQL 来“查询过去 3 0 天内购买手机和屏幕保护膜的用户”。
你写了一个可以等待吃饭的三层嵌套子查询。
后来使用WITH语句(CTE)进行重构,性能直接提升了5 0%。
说实话,当时我并不明白为什么,但是后来我了解到数据库优化器对CTE的递归处理比嵌套子查询更聪明。

在数据库管理方面,我执行过的最令人震惊的操作是自动为 Oracle 数据库创建索引脚本。
当系统在某个时刻变慢时,我检查了 V$SQL 统计信息,发现某个特定查询被执行了数千次。
脚本自动分析执行计划,查找热点列,批量创建B树索引。
结果呢?系统响应时间立即重置为零。
当然,也有出错的时候。
例如2 01 2 年创建索引时没有添加WITH GRANT OPTION,导致运维人员没有足够的权限进行删除。
我最终穿着格子衬衫,在电脑房呆了一整夜,手动解锁。

非过程式编程特别有趣。
我记得一家初创公司的CTO必须把所有存储操作都写成存储过程,美其名曰“数据封装”。
结果呢?三个月后,代码库一片混乱。
一个简单的查询必须调用三个存储过程。
当新人提出需求时,他们必须寻找开发人员、测试和产品。
最终它们被分解为原子 SQL。
现在回想起来,这是典型的过度设计。
SQL 的优势恰恰在于它不会强迫您考虑底层实现。

我遇到了跨数据库兼容性的陷阱。
2 01 8 年,我帮助客户从MySQL迁移到PostgreSQL,因为我认为只改变SQL就足够了。
结果,我们遇到了 JSON 处理能力的差异、不同的窗口函数语法以及不同的默认事务隔离级别。
经过半个月的修改,终于发现需要条件编译才能让一组代码两边都跑起来。
如果数据量不大,这很好。
只有真正测算数据量,才能了解标准化背后隐藏的适应成本。

回想起来,SQL就像一个老司机。
你只要告诉他目的地就行了,不用管他怎么开车。
但有时路况过于复杂(例如数据量极大或者结构特别奇怪)。
如果不了解基本原理,您甚至可能无法正确踩刹车。
例如,我见过人们使用 GROUP BY 进行分页,但性能很糟糕。
那时我觉得自己太年轻了。