我目前正在尝试优化一些 bobj 报告,其中我们的后端是 Teradata。这 Teradata优化器 看起来很挑剔,我想知道是否有人想出了一个 解决方案或解决方法 让优化器 以类似的方式对待喜欢的人.

My issue is that we allow the user to input one of two methods:
 1. Enter the Number:
    or
 2. Enter a Number like:

选项一的表现就像梦一样,而选项二则将我们的查询时间从 6 秒拖到了 2 分钟。

除此之外;有谁知道有什么好的文章、讨论、视频等吗?关于为 Teradata 优化器优化 SQL 语句?

有帮助吗?

解决方案

由于该列定义为VARCHAR,并且您正在使用类似运算符,因此您消除了将PI用于单个AMP访问的可能性。请记住,主要索引首先作业是在系统中的AMP上分发数据。因为您使用的是对PI的类似运算符,因此优化器必须执行“所有放大器”操作以满足类似运算符。

WHERE MyPIColumn LIKE '123%'

从123开始,最终将在多个放大器上进行散列。

WHERE MyPIColum = '123'

123的哈希将在同一放大器上将每个记录都放置。查询“ 123”始终是单个放大器操作。

关于此的统计数据可能有助于行估计,但可能不会消除“全部AMP”操作。

  1. 这是独特的pi还是非唯一的pi?
  2. 为什么选择数据类型是数字上的字符?尽管GT(E)或LT(E)可能会导致相同的“全AMP”操作。
  3. 模型中其他表是否共享此PI以促进AMP本地联接策略?

其他提示

我认为这个数字是索引的? Teradata使用哈希进行索引,因此平等将导致使用索引,而类似的方式将进行全表扫描。

如果您真正需要使用类似,那么您无能为力。您可以尝试的一件事是使用 Substr(Number, 1, 3) = '123' 而不是 Number LIKE '123%'. 。过去,我已经从中得到了少量的改进,但不要期望任何壮观。

您将需要全文索引/预标记化索引,例如lucene,还有两个解析搜索。

例如当将“12345”插入数据库时​​,创建从“1”、“12”、“123”、“234”...等到“12345”的链接。

然后,当使用find类似“123**”时,从查找表中找到“123”并查找记录“12345”

如果您进行了直接的VARCHAR比较,即

Column LIKE 'VALUE'

然后,您可以尝试在该列上使用NUSI。确保收集表的主要索引和索引的统计信息

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top