0

我正在使用 PHP 从分区中检索所有行。我正在使用下面的方法来获取所有行

http://www.windowsazure.com/en-us/develop/php/how-to-guides/table-service/#RetEntitiesInPartition

面临一个独特的问题:如果我使用一个分区结果返回,使用多个带有 OR 子句的分区不会返回任何结果。

对我来说似乎有两个问题:

  1. 在其他列上使用 OR 条件和过滤器进行分区,导致某些事情变得精神错乱。

  2. PHP SDK(版本 2.0)存在问题

任何帮助将不胜感激,

  1. 查询具有Partition正确使用的列。例如,如果我正在运行此查询(针对两个分区的 10 行)

    ( cid eq '18831') and ( (PartitionKey eq '2013100606') or (PartitionKey eq '2013100607') )
    

    使用 PHP 脚本的 OR 子句,partitionkey 有多个值时没有响应。使用存储资源管理器应用程序似乎需要超过 5 秒才能从两个分区中提取 10 行。(我只有 10 行,两个分区中没有其他数据)

如果我只访问一个分区,它会返回行。

( cid eq '18831') and ( (PartitionKey eq '2013100607') )  // Works fine

每个分区有 10 行,如果我访问单个分区值,它工作正常。

另请注意,我正在使用 expect100Continue 并关闭了 Nagle。

      <servicePointManager expect100Continue="false" useNagleAlgorithm="false"/> 
    </settings> 
<connectionManagement> 
      <add address = "*" maxconnection = "48" /> 
    </connectionManagement>
4

1 回答 1

1

根据 Windows Azure 存储团队的博客文章 - How to get most out of Windows Azure Tables(向下滚动到Queries文章中的部分,第 4 点),涉及OR的查询未优化,将导致全表扫描。因此,您可能会遇到问题。

您可能需要更改查询以避免这种情况。您可以尝试的几件事是:

((PartitionKey ge '2013100606') and (PartitionKey le '2013100607')) and (cid eq '18831')

(PartitionKey eq '2013100606' and cid eq '18831') or (PartitionKey eq '2013100607' and cid eq '18831')

看看是否有这些帮助。您可以并行触发两个单独的查询,而不是第二个查询。

于 2013-10-09T08:30:25.653 回答