按ASC排序与DESC排序之间的性能差异很大

时间:2019-02-19 13:15:28

标签: azure-cosmosdb azure-cosmosdb-sqlapi

我在CosmosDB SQL API中记录了ORDER BY ASC和DESC之间的巨大差异。与DESC相比,ASC在RU中的价格便宜了近200倍。

这是我测试工具的输出:

INFO ------------------- QUERY -----------------

SELECT TOP 100 * FROM root
WHERE
    root.projectId = '783af8f2-8e2f-0083-5d86-2f60f34e11b4'
        AND NOT ARRAY_CONTAINS(root.translatedLanguages, '0d42a87f-4d68-417b-99a9-a228cb63edce')
ORDER BY root._srtDue DESC


INFO ------------------- ROUND 1 -----------------
INFO Request Charge: 2532.53
INFO Count: 100
INFO Metrics: {
  "TotalTime": "00:00:01.7036800",
  "RetrievedDocumentCount": 38238,
  "RetrievedDocumentSize": 236459696,
  "OutputDocumentCount": 100,
  "IndexHitRatio": 0.0,
  "QueryPreparationTimes": {
    "CompileTime": "00:00:00.0001900",
    "LogicalPlanBuildTime": "00:00:00.0000700",
    "PhysicalPlanBuildTime": "00:00:00.0000600",
    "QueryOptimizationTime": "00:00:00.0000100"
  },
  "QueryEngineTimes": {
    "IndexLookupTime": "00:00:00.0298500",
    "DocumentLoadTime": "00:00:01.4093599",
    "WriteOutputTime": "00:00:00.0001300",
    "RuntimeExecutionTimes": {
      "TotalTime": "00:00:00.2636001",
      "SystemFunctionExecutionTime": "00:00:00.0132800",
      "UserDefinedFunctionExecutionTime": "00:00:00"
    }
  },
  "Retries": 0
}

vs

INFO ------------------- QUERY -----------------

SELECT TOP 100 * FROM root
WHERE
    root.projectId = '783af8f2-8e2f-0083-5d86-2f60f34e11b4'
        AND NOT ARRAY_CONTAINS(root.translatedLanguages, '0d42a87f-4d68-417b-99a9-a228cb63edce')
ORDER BY root._srtDue ASC


INFO ------------------- ROUND 1 -----------------
INFO Request Charge: 14.22
INFO Count: 100
INFO Metrics: {
  "TotalTime": "00:00:00.0047500",
  "RetrievedDocumentCount": 131,
  "RetrievedDocumentSize": 187130,
  "OutputDocumentCount": 100,
  "IndexHitRatio": 0.75572519083969469,
  "QueryPreparationTimes": {
    "CompileTime": "00:00:00.0001300",
    "LogicalPlanBuildTime": "00:00:00.0000700",
    "PhysicalPlanBuildTime": "00:00:00.0000600",
    "QueryOptimizationTime": "00:00:00.0000100"
  },
  "QueryEngineTimes": {
    "IndexLookupTime": "00:00:00.0010400",
    "DocumentLoadTime": "00:00:00.0020299",
    "WriteOutputTime": "00:00:00.0002200",
    "RuntimeExecutionTimes": {
      "TotalTime": "00:00:00.0008301",
      "SystemFunctionExecutionTime": "00:00:00.0000500",
      "UserDefinedFunctionExecutionTime": "00:00:00"
    }
  },
  "Retries": 0
}

我还没有找到如何精确计算IndexHitRatio以及如何计划Cosmos DB执行,但是在我看来,在这种特殊情况下,它将针对指定顺序的文档运行谓词,而满足这些谓词的文档位于排序顺序的末尾,因此必须读取大量文档(38K)才能获得前100个输出文档。

我们相信我们都已正确索引了

path": "/*",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                },
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": -1
                }
            ]
...
"path": "/translatedLanguages/[]/?",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": -1
                },
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                }
            ]

不幸的是,这种性能在我们的用例中是不可接受的,如果我们不以某种方式解决它,我们将不得不更改数据库引擎。

是否有办法调整执行计划以提高性能?

0 个答案:

没有答案