SQLite 表别名影响查询性能

标签 sql sqlite alias

SQLite 内部如何处理别名?

创建表名别名是否会在内部创建同一个表的副本,还是仅引用同一个表而不创建副本?

当我在代码中创建同一个表的多个别名时,查询的性能会受到严重影响!

就我而言,我有一个表,将其称为 MainTable,其中包含 2 列:名称和值。 我想选择一行中的多个值作为不同的列。例如

名称:a、b、c、d、e、f
值:p、q、r、s、t、u
使得 a 对应于 p 等等。

我想在一行中选择名称 a、b、c 和 d 的值 => p、q、r、s 所以我写了一个查询

SELECT t1.name, t2.name, t3.name, t4.name  
FROM MainTable t1, MainTable t2, MainTable t3, MainTable t4
WHERE t1.name = 'a' and t2.name = 'b' and t3.name = 'c' and t4.name = 'd';

当表的大小增加时,编写查询的这种方式会降低性能,正如 Larry 在上面正确指出的那样。

有没有有效的方法来检索此结果。我不擅长 SQL 查询:(

最佳答案

如果您在 SQL 语句中多次列出同一个表,并且不提供 JOIN 这些表的条件,那么您将在结果集中创建笛卡尔 JOIN,这将是巨大的:

 SELECT * FROM MyTable A, MyTable B;

如果MyTable有1000条记录,将创建一个有100万条记录的结果集。您包含的任何其他选择标准都必须在所有 100 万条记录中进行评估。

我不确定这就是您正在做的事情(您的问题非常不清楚),但这可能是解决您的问题的开始。

现在更新了答案,发帖者已添加正在执行的查询。

您必须采取一些技巧才能获得您想要的结果。您需要使用 CASE 和 MAX,不幸的是,CASE 的语法有点冗长:

 SELECT MAX(CASE WHEN name='a' THEN value ELSE NULL END),
        MAX(CASE WHEN name='b' THEN value ELSE NULL END),
        MAX(CASE WHEN name='c' THEN value ELSE NULL END),
        MAX(CASE WHEN name='d' THEN value ELSE NULL END)
  FROM MainTable WHERE name IN ('a','b','c','d');

请在您的实际数据库中尝试一下,看看您会得到什么(当然,您要确保列名已建立索引)。

关于SQLite 表别名影响查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7367548/

相关文章:

ios - 在 iOS 中解析时在 SQLite 中批量存储

objective-c - 以编程方式将菜单+项目添加到 NSPopupButton

Mercurial:带参数的别名

php - 选中复选框时如何为 SQL 表提供样式?

ios - 用于存储日期的 CoreData 推荐做法

php - 如何使用 PHP 从具有多个同名列的 MySQL 行中获取结果?

mysql - SELECT * 连接中列名的别名

indexing - 在 Elasticsearch 中删除别名和索引

mysql - SQL 垂直分组

.net - 将 DateTime 解析为 SQL Server 的最佳方法