好吧我对SQL语言几乎一无所知,并且想知道在unidata中两个WITH与一个WITH的缓慢可能的原因是什么。
数据库有大约100万行。
IE /
SELECT somewhere WITH Column1 = "str" AND WITH Column2 = "Int"
5<分钟
与
相比 SELECT somewhere WITH Column1 = "str"
~1秒
某处被索引(据我所知)
那么我有什么问题吗?
如果需要更多信息,请询问,不知道要提供什么。
还介绍了WITH和WHERE之间的区别吗?
答案 0 :(得分:4)
这不是SQL,它是UniQuery。
要为您澄清,您不能索引文件(在本例中为somewhere
),仅索引文件的列。您可能会发现Column1
已编入索引而Column2
未编入索引。输入LIST.INDEX somewhere
以找出已编入索引的列。
对于您的问题,您只比较了Column1上的选择与Column1&上的选择。 Column2并假设响应速度非常慢,纯粹是因为您选择了2列。你的下一篇文章应该只在Column2上选择,看看它有多慢。
除了索引之外,还有许多可能的原因来解释响应的差异。在UniData中,列被定义为“字典项”。有different types个字典项。最基本的是D型字典项,它只是对记录中字段的直接引用。另一种类型是I或V型,它是派生字段。派生字段可以像返回常量一样简单,也可以像执行与另一个文件和/或某种形式的复杂计算执行JOIN的等效一样复杂。这应该很容易看出不同的列可以处理大量不同的处理。
其他原因是列的记录深度(第一个字段引用将比记录中的字段更快)以及可能影响SELECT的计时的潜在查询缓存。
有关详细信息,请查看Rocket Software上的数据库手册。
答案 1 :(得分:1)
索引字段上的单列SELECT甚至不需要读取任何数据文件记录。如果你看一下,你会发现索引文件是一个普通的哈希文件,而单列SELECT只是意味着读取带有键“str”的索引文件记录。这可能会在不到一秒的时间内返回成千上万的密钥。
添加第二列后,您可能会强制系统读取所有成千上万条记录,即使第二列已被索引。这将花费更多的时间。
通常,具有少量唯一值的字段上的索引具有可疑用途。如果第二列包含具有大量可能值的数据,导致具有每个特定索引值的较少数量的记录,则最好安排SELECT,使得使用的索引位于第二列上。我不确定,但是可以简单地反转SELECT语句中列的顺序来执行此操作。否则,您可能需要背靠背运行两个SELECT语句。
例如,假设文件包含600,000条记录,其中Column1 =“str”,2,000条记录的Column2 =“int”:
>SELECT somewhere WITH Column2 = "int"
>>SELECT somewhere with Column1 = "str"
将读取2,000条记录,并且几乎可以立即返回。
如果Column1和Column2的组合是你经常选择的东西,那么你可能想要创建一个新的字典项,将它们组合在一起,并在其上构建一个索引。
话虽这么说,它不应该花费U2系统5分钟来运行一百万条记录的文件。文件很可能已经严重溢出,需要使用更大的模数调整大小以提高性能。