SQL 性能,什么在 SELECT 和 WHERE 条件下执行得更快

标签 sql postgresql query-optimization query-performance

更新:废话!它不是一个整数,它是可变的(10)

像这样执行查询使用索引

SELECT t."FieldID"
FROM table t
WHERE t."FieldID" = '0123456789'

但如果我执行此操作则不会使用索引

SELECT t."FieldID"
FROM table t
WHERE t."FieldID" LIKE '01%'

或者这个

SELECT t."FieldID"
FROM table t
WHERE "substring"(t."FieldID", 0, 3) = '01'

还有这个

SELECT t."FieldID"
FROM table t
WHERE t."FieldID" ~ '^01'

我的索引看起来像这样

CREATE UNIQUE INDEX fieldid_index
  ON "table"
  USING btree
  ("FieldID");

运行 PostgreSQL 7.4(是的,正在升级)

我正在优化我的查询,想知道在语句的 SELECT 或 WHERE 子句中使用三种类型的表达式之一是否有任何性能提升。

注意:使用这些约束样式执行的查询返回大约 200,000 条记录

示例数据是一个字符 varying(10):0123456789 并且它也被索引

<强>1。 (子串)

SELECT CASE
    WHEN "substring"(t."FieldID"::text, 0, 3) = '01'::text         
    THEN 'Found Match'::text
    ELSE NULL::text
END AS matching_group

<强>2。 (点赞)

SELECT CASE
    WHEN t."FieldID"::text LIKE '01%'         
    THEN 'Found Match'::text
    ELSE NULL::text
END AS matching_group

<强>3。 (正则表达式)

SELECT CASE
    WHEN t."FieldID" ~ '^01'         
    THEN 'Found Match'::text
    ELSE NULL::text
END AS matching_group

在 WHERE 子句中使用一个比另一个有任何性能优势吗?

<强>1。 (子串)

WHERE CASE
    WHEN "substring"(t."FieldID"::text, 0, 3) = '01'::text         
    THEN 1
    ELSE 0
END = 1

<强>2。 (点赞)

WHERE CASE
    WHEN t."FieldID"::text LIKE '01%'         
    THEN 1
    ELSE 0
END = 1

<强>3。 (正则表达式)

WHERE CASE
    WHEN t."FieldID" ~ '^01'         
    THEN 1
    ELSE 0
END = 1

在 SELECT 中使用一个选项而在 WHERE 子句中使用不同的选项是否会提高性能?

最佳答案

我个人认为制造这种问题的人不应该被允许使用“性能”这个词。恕我直言,对数字字段(甚至可能是关键字段)内容的文本表示 的限制(如 WHERE 子句中的限制)表明设计不佳。

如果这是我的数据,我会在记录中添加一个标志字段,指示在查询 xyz 中需要/不需要。甚至可以将其放入单独的表格中。我更喜欢添加一个(冗余的?)列来创建基于 GW-basic-substring 垃圾的整个索引。

关于SQL 性能,什么在 SELECT 和 WHERE 条件下执行得更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7416814/

相关文章:

sql - 配置单元查询以将键映射到多个值

c# - 在处理 SqlConnection、SqlDataReader、SqlCommand 时要捕获哪些异常?

SQL 在数字第一次出现时分割字符串

php - 优化 MySQL 计数查询,提供完整信息

mysql - 如何检查两个表或子查询结果中存在的属性

sql - 如何创建一个等于最后插入行的id的临时变量

sql - postgres - SELECT/GROUP BY 中的部分列 - 列必须出现在 GROUP BY 子句中或用于聚合函数

django - psycopg2 奇怪的行为

php - 优化我项目的场景对象

mysql - 复合索引中的 OR 问题