Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数百万行上类似“query%”的性能,postgresql_Postgresql - Fatal编程技术网

数百万行上类似“query%”的性能,postgresql

数百万行上类似“query%”的性能,postgresql,postgresql,Postgresql,我们有一张1000万行的桌子。我们需要找到像“user%”这样的前几行 如果此查询与至少2行匹配,则它将在0.5秒内返回结果。如果找不到任何2行符合该条件,则至少需要10秒。10秒对我们来说是巨大的,因为我们正在使用这个自动建议,用户不会等这么久才看到建议 查询:从用户会话中选择distinctname,其中“user%”等名称限制为2 在上面的查询中,“名称”列的类型为citext,并且已编制索引。无论何时处理性能问题,都要从取消查询开始。这将显示查询优化器的计划,并且您可以了解它在处理不同部

我们有一张1000万行的桌子。我们需要找到像“user%”这样的前几行

如果此查询与至少2行匹配,则它将在0.5秒内返回结果。如果找不到任何2行符合该条件,则至少需要10秒。10秒对我们来说是巨大的,因为我们正在使用这个自动建议,用户不会等这么久才看到建议

查询:从用户会话中选择distinctname,其中“user%”等名称限制为2


在上面的查询中,“名称”列的类型为citext,并且已编制索引。

无论何时处理性能问题,都要从取消查询开始。这将显示查询优化器的计划,并且您可以了解它在处理不同部分上花费了多长时间。特别是,检查是否有任何完整的表扫描,这意味着数据库正在检查表中的每一行

由于查询在找到某个内容时速度很快,而在没有找到某个内容时速度很慢,因此听起来您确实在进行完整的表扫描。我相信它是被索引的,但是因为你在做一个类似的事情,标准的字符串索引不能被有效地使用。根据名称的列类型,您将要签出或发送文本\u pattern\u ops。您可以这样创建:

CREATE INDEX ON pattern_index_on_users_name ON users (name varchar_pattern_ops)
创建索引后,请检查解释查询以确保正在使用它。text_pattern_ops,因此在本例中,您必须索引并搜索lowername以获得良好的不区分大小写性能:

CREATE INDEX ON pattern_index_on_users_name ON users (lower(name) text_pattern_ops)

无论何时,只要您在处理性能问题,就从查询开始。这将显示查询优化器的计划,并且您可以了解它在处理不同部分上花费了多长时间。特别是,检查是否有任何完整的表扫描,这意味着数据库正在检查表中的每一行

由于查询在找到某个内容时速度很快,而在没有找到某个内容时速度很慢,因此听起来您确实在进行完整的表扫描。我相信它是被索引的,但是因为你在做一个类似的事情,标准的字符串索引不能被有效地使用。根据名称的列类型,您将要签出或发送文本\u pattern\u ops。您可以这样创建:

CREATE INDEX ON pattern_index_on_users_name ON users (name varchar_pattern_ops)
创建索引后,请检查解释查询以确保正在使用它。text_pattern_ops,因此在本例中,您必须索引并搜索lowername以获得良好的不区分大小写性能:

CREATE INDEX ON pattern_index_on_users_name ON users (lower(name) text_pattern_ops)

谢谢你的回复。我已经尝试过varchar_pattern_ops,对于varchar类型来说效果很好,对于citext类型来说问题仍然存在。很遗憾,我们无法将citext类型更改为varchar。您需要索引并搜索lowername,再次感谢您的帮助。它适用于除主键列之外的所有列。它不允许我为promary键列添加这样的索引。主键只能由裸列组成。如果您需要一个有模式的不区分大小写的索引,您必须创建一个重复的非主索引。谢谢您的回复。我已经尝试过varchar_pattern_ops,对于varchar类型来说效果很好,对于citext类型来说问题仍然存在。很遗憾,我们无法将citext类型更改为varchar。您需要索引并搜索lowername,再次感谢您的帮助。它适用于除主键列之外的所有列。它不允许我为promary键列添加这样的索引。主键只能由裸列组成。如果您需要一个有模式的不区分大小写的索引,那么必须创建一个重复的非主索引。