比较可以任意链接,例如,
x < y <= z
等同于x < y and y <= z
,除了y
仅评估一次(但在两种情况下z
都没有被评估,当x < y
发现是假的时).
这些SO问题/答案对这种用法有了更多的了解:
所以像(人为的例子):
if 1 < input("Value:") < 10: print "Is greater than 1 and less than 10"
Run Code Online (Sandbox Code Playgroud)
只要求输入一次.这是有道理的.还有这个:
if 1 < input("Val1:") < 10 < input("Val2:") < 20: print "woo!"
Run Code Online (Sandbox Code Playgroud)
只询问Val2
是否 Val1
介于1和10之间,只打印"呜!" 如果 Val2
也是10到20之间(证明它们可以'任意链接').这也是有道理的.
但我仍然很好奇这是如何在词法分析器/解析器/编译器(或其他)级别实际实现/解释的.
上面的第一个例子基本上是这样实现的:
x = input("Value:")
1 < x and x < 10: …
Run Code Online (Sandbox Code Playgroud) 位图扫描的作者描述了位图堆扫描和索引扫描之间的区别:
一个普通的indexscan一次从索引中获取一个元组指针,然后立即访问表中的该元组。位图扫描一次性从索引中获取所有元组指针,使用内存中的“位图”数据结构对其进行排序,然后以物理元组位置顺序访问表元组。位图扫描提高了表的引用局部性,但要花更多的簿记开销来管理“位图”数据结构---并且不再按索引顺序检索数据,这对您来说无关紧要查询,但是如果您说ORDER BY会很重要。
问题:
当索引已排序时,为什么又对获取的元组指针进行排序?
它如何与位图排序?我知道位图是什么,但是我不知道如何将其用于排序。
为何要获取中等比例的表,为什么它比索引扫描更快?相反,它似乎为该过程增加了很多计算。