sql-server-2008 - postgresql中如何编写索引查询

标签 sql-server-2008 postgresql indexing

在sql server中索引查询写法如下 SELECT * FROM TabEmp WITH (INDEX(idx_TabEmp))

以同样的方式如何在postgresql中编写查询以及如何在postgresql中使用索引。

最佳答案

PostgreSQL 附带了一个非常先进的规划器,它可以最好地使用所有可能的方式,以便以最有效的方式提供查询详细信息。

当涉及到索引时,只需在适当的列上创建它们,很可能是在 FROM (显式表示法)、WHEREORDER BY 子句。如documentation说:

Once an index is created, no further intervention is required: the system will update the index when the table is modified, and it will use the index in queries when it thinks doing so would be more efficient than a sequential table scan.

当然,你必须ANALYZE您的表格并查看 EXPLAIN输出以了解数据库实际上正在做什么来处理您的查询。


编辑

我的日常主要工作是管理一组在 ORACLE 上运行的计费生产系统,所以我知道提示是什么。作为管理员,我非常了解我的架构和数据,并且在大多数情况下,我确实知道执行查询的最佳计划是什么。

现在,由于 ORACLE 提供很多不同的功能,它的优化器根本无法“ catch ”可能路径的数量。于是他们另辟蹊径,添加了提示。我确实使用它们,因为无论我如何处理相关关系的统计数据,我都没有其他方法可以强制我知道应该执行最佳的具体计划。

PostgreSQL走了另一条路。他们没有提供提示,而是花费了大量时间来使计划表变得像今天一样好。我印象深刻,这就是 PostgreSQL 将所有其他 RDBMS 踢出圈子的地方。恕我直言。

是的,使用 PostgreSQL 并不总是能得到最好的计划。但有一些方法可以达到目标。正如其他人已经指出的:

  1. 您应该了解自己的数据,并且应该知道最佳计划是什么样的;
  2. 使用适当的工具,例如EXPLAIN(分析,缓冲区)以及http://explain.depesz.com/
  3. 确保您拥有正确的统计数据;
  4. 尝试使用 enable_* 设置来真正获得正确的计划;
  5. 如果仍然没有运气,请查看数据并了解为什么所选计划不是最好的计划。我假设您会发现数据分布偏差与 PostgreSQL 收集查询中涉及的某些特定属性的统计信息的方式不匹配;
  6. 调整您发现存在数据偏差的列的SET STATISTICS
  7. 如果仍然不行,您可以使用其他技术,例如范围或列表分区,partial indexes 、CTE,有很多。

根据我使用 PostgreSQL 的经验,从来没有必要使用提示。尽管添加提示“快速且简单”,但我总是更喜欢通过常见方法解决性能不佳的查询,因为如果数据分布或数据库使用模式发生变化(相当常见的情况),提示可能会做得很糟糕。

我看到提示可能有用的唯一地方:修复您正在使用/支持的闭源软件的生产问题。但如果您在推出新版本之前进行深入而彻底的质量检查和性能测试,情况也并非如此。

如果您仍然需要提示,请查看 plantuner作者:奥列格·巴图诺夫和特奥多尔·西加耶夫。此扩展不在标准 PostgreSQL 发行版中,但考虑到 Oleg 和 Teodor 属于 PostgreSQL 核心开发团队(他们为该项目创建了 GIN、GIST 和 FTS),我希望代码相当稳定。

关于sql-server-2008 - postgresql中如何编写索引查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14935673/

相关文章:

SQL MOVE记录到另一个表

python - Pandas groupby 对象过滤

mysql - 在主键+外键上创建多重索引是否有性能优势?

java - 如何在 spring data mongodb 中对所有字段建立索引?

sql-server - SQL Server 错误 [SQLState 42000](错误 325)

sql - 具有 uniqueidentifier 的递归 CTE 必须在 anchor 中具有值

sql-server-2008 - SQL Server 2008 - 报表管理器 URL 显示没有“属性”选项卡的页面

php - INSERT 如果不存在,否则返回 id

postgresql - 如何在 Nixos 上安装 postgresql-client/psql

javascript - 如何在 postgres plv8 过程中记录字符串?