通过SQL语句的select子句中的列顺序进行优化

时间:2019-07-13 14:47:20

标签: sql

在我参加的一次采访中,我被要求优化SQL查询。表PRODUCTS的结构如下:

  • PRODUCT_NAME-重复了大约200个唯一值
  • STATE-重复了约20个唯一值
  • COUNTRY-重复了大约5个唯一值

该表包含一百万行。我得到了下面的SQL语句,并被要求完成它。 SQL将获取特定状态的所有产品。

SELECT _______ 
FROM PRODUCTS 
WHERE STATE = 'CALIFORNIA'

我的回答如下:

SELECT PRODUCT_NAME, STATE, COUNTRY 
FROM PRODUCTS 
WHERE STATE = 'CALIFORNIA'

面试官对答案不满意,后来告诉我,select子句中的列顺序本可以用于优化,但我没有这样做。

在select语句中使用的列顺序是否也对select查询的效率有任何显着改善。如果可以,怎么办?

1 个答案:

答案 0 :(得分:1)

我无法理解访问者的想法或访问者所指的数据库类型。

数据库将数据存储在数据页上,该数据页使用二进制格式并包含其他信息(例如null标志以及记录ID和页面ID等)。检索记录的值需要解析数据页-而且无论查询返回的列的顺序如何,都将进行解析。

也许混淆在于索引。一些数据库建议根据选择性(即值的数量)在多列索引中对列进行排序。当索引中的所有列都用于相等性比较时,可能会有一些轻微的优化。但是,基于要优化的查询,索引中列的顺序通常受其他因素影响。

我容易想到的唯一优化是删除列。如果您知道状态,则没有理由返回状态。您可能打算将该州设在美国,因此该国家也无关紧要。使用常量('California' as state)可能会进行一些优化,但是很难想象有人真正关心在读取大表的查询上对性能的这种纳米改进。