技术归档文章随笔一句话导航搜索关于

SQL Server 性能优化

日期: 2023-04-20 分组: 数据库 标签: SQLServer面试 3分钟 524字

优化总结

  • 代码层面优化
    • 尽量使用索引字段
    • 避免 SELECT *,避免在 SELECT 中使用子查询
    • 尽量减少 JOIN 操作,必要时时候使用子查询或临时表
    • 小表驱动大表
  • 数据库层面
    • 合理设计表结构,避免冗余
    • 数据分区分表
    • 冷热数据分离,冷数据进行数据归档
  • 系统架构层面
    • 读写分离
    • 使用缓存存储热点数据
  • 硬件层面
    • 提高硬件性能

优化细节

避免在 SELECT 子句使用子查询

1
SELECT
2
CustomerID,
3
(SELECT SUM(TotalAmount) FROM Orders WHERE CustomerID = 1001) AS TotalSpent
4
FROM Customers
5
WHERE CustomerID = 1001;

尽量减少 JOIN 操作

例子:使用 EXISTS 子查询代替 JOIN

我们想要查询所有下过订单的用户。通常,我们会使用 JOIN 操作:

1
SELECT u.* FROM users u
2
JOIN orders o ON u.id = o.user_id;
3
4
-- 但我们可以使用EXISTS子查询来达到同样的目的:
5
6
SELECT u.* FROM users u
7
WHERE EXISTS (SELECT 1 FROM orders o WHERE u.id = o.user_id);

小表驱动大表

例子:我们拥有客户表和订单表,订单表数据量大,我们使用客户表来作为主表,对订单表进行关联查询

1
SELECT o.order_id, o.order_amount, c.customer_name
2
FROM customers c
3
JOIN orders o ON c.customer_id = o.customer_id;

数据分区分表

  • 数据分区:表分区可以根据某些条件(例如时间、ID 范围等)将数据分割到多个表中,查询时只访问相关的分区,减少了全表扫描的开销。一般分布式数据库天生支持数据分区,通常的数据库,分区策略设计复杂,需要考虑事务一致性等问题。
  • 水平拆分:将数据分散到多个独立的表或数据库中,通常基于某种规则(如 ID、区域、日期等)。每个表包含数据的一个子集,可以提高查询效率。
  • 垂直拆分:垂直拆分是将一个大表按照列的不同将其分成多个小表,每个小表中包含相同的行,但列数不同。使用时按需进行 JOIN 连接。
人应当是有理想的.
文章目录