├── .gitignore ├── README.md ├── download.md ├── paper-results ├── Paralellism.ipynb ├── cache-hitrates.ipynb ├── classification.ipynb ├── intdata-characteristics.ipynb ├── io-distribution.ipynb └── submission-times.ipynb ├── profile.md └── schema.md /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints 2 | 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Snowflake Dataset 2 | 3 | This repository contains documentation for the dataset that accompanies our NSDI 2020 paper, "Building an Elastic Query Engine on Disaggregated Storage". It also includes scripts to aid with processing of the data and to reproduce the analysis results in the paper. 4 | 5 | ## Main Dataset 6 | 7 | The main dataset contains several statistics (timing, I/O, resource usage, etc..) pertaining to ~70 million queries from all customers that ran on [Snowflake](https://www.snowflake.com/) over a 14 day period from Feb 21st 2018 to March 7th 2018. This dataset is available in both CSV and Parquet formats and can be obtained from the [Downloads](download.md) page. 8 | 9 | ### Schema 10 | 11 | Each row corresponds to one unique query with the columns representing various characteristics pertaining to that query. The **queryId** column contains a unique 64-bit identifier for each query. For a detailed description of all of the columns, please refer to the [Schema](schema.md) page. 12 | 13 | ## Auxiliary Time-series Explosion 14 | 15 | We also provide some auxiliary data to make it easier to perform time-series analysis (e.g. things like how do resource utilizations vary over time). This data is also available in both CSV and Parquet formats and can be obtained from the [Downloads](download.md) page. Note that this data can be computed from the main dataset, we are just providing a pre-computed version for convenience. 16 | 17 | ### Schema 18 | 19 | Each row consists of a **timestamp**, **queryId** pair indicating that query with identifier **queryId** was running/active at timestamp **timestamp**. For every query that is running/active at **timestamp** there will be one such row. So to compute a time-series of how many queries were active at given timestamp, one could simply do the equivalent of `SELECT COUNT(*) AS queryCount GROUP BY timestamp`. To bring in other query statistics one can join this data with the main dataset on the **queryId** column. For more details, please refer to the [Schema](schema.md) page. 20 | 21 | ## Scripts 22 | 23 | The [scripts/](scripts/) directory has some helper scripts to aid with dataset manipulation. This includes AWK headers and some sample pandas scripts. In addition the [paper-results/](paper-results/) directory contains a set of IPython notebooks (written mostly using pandas) that can re-produce all of the results in our NSDI 2020 paper. 24 | 25 | ## Limitations 26 | 27 | ## Privacy Concerns 28 | 29 | All identifiers in the dataset that could potentially reveal a customer's identity have been replaced by pseudo-random numbers to preserve anonymity. Public access to the information in this dataset does not lead to any privacy or other ethical concerns. 30 | 31 | ## Contact 32 | 33 | Midhul Vuppalapati ([midhul@cs.cornell.edu](mailto:midhul@cs.cornell.edu)) 34 | 35 | ## Usage 36 | 37 | Information in this dataset is open to the public for use in research and education purposes. Kindly cite the following publication if you are using our dataset: 38 | 39 | ``` 40 | @inproceedings {snowflake-nsdi20, 41 | author = {Midhul Vuppalapati and Justin Miron and Rachit Agarwal and Dan Truong and Ashish Motivala and Thierry Cruanes}, 42 | title = {Building An Elastic Query Engine on Disaggregated Storage }, 43 | booktitle = {17th {USENIX} Symposium on Networked Systems Design and Implementation ({NSDI} 20)}, 44 | year = {2020}, 45 | isbn = {978-1-939133-13-7}, 46 | address = {Santa Clara, CA}, 47 | pages = {449--462}, 48 | url = {https://www.usenix.org/conference/nsdi20/presentation/vuppalapati}, 49 | publisher = {{USENIX} Association}, 50 | month = feb, 51 | } 52 | ``` 53 | 54 | -------------------------------------------------------------------------------- /download.md: -------------------------------------------------------------------------------- 1 | The dataset is available for download from the following links. 2 | 3 | ## Main Dataset 4 | 5 | - Main Dataset CSV (gzip compressed): http://www.cs.cornell.edu/~midhul/snowset/snowset-main.csv.gz 6 | - Main Dataset Parquet (tar + gzip compressed): http://www.cs.cornell.edu/~midhul/snowset/snowset-main.parquet.tar.gz 7 | 8 | ## Auxiliary Time-series Explosion 9 | 10 | - Auxiliary Time-series Explosion CSV (gzip compressed): http://www.cs.cornell.edu/~midhul/snowset/ts-explosion.csv.gz 11 | - Auxiliary Time-series Explosion Parquet (tar + gzip compressed): http://www.cs.cornell.edu/~midhul/snowset/ts-explosion.parquet.tar.gz 12 | -------------------------------------------------------------------------------- /paper-results/cache-hitrates.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "# Cache hit-rate distributions\n", 10 | "import pandas as pd\n", 11 | "import matplotlib.pyplot as plt\n", 12 | "from matplotlib import colors\n", 13 | "import numpy as np\n", 14 | "%matplotlib inline" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 2, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "# Load persistent data I/O stats of queries\n", 24 | "df = pd.read_parquet('~/snowflake-analysis/snowset-main.parquet', columns = ['persistentReadBytesCache', \n", 25 | " 'persistentReadBytesS3', \n", 26 | " 'persistentWriteBytesS3',\n", 27 | " 'persistentWriteBytesCache'],\n", 28 | " engine='fastparquet')" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 5, 34 | "metadata": {}, 35 | "outputs": [], 36 | "source": [ 37 | "# Calculate total amount of persistent data bytes read and written\n", 38 | "df['persistentReadBytes'] = df['persistentReadBytesCache'] + df['persistentReadBytesS3']\n", 39 | "# Cache is write-through\n", 40 | "df['persistentWriteBytes'] = df['persistentWriteBytesS3']\n", 41 | "# Assign query classes\n", 42 | "df['ronly'] = (df['persistentWriteBytes'] == 0)\n", 43 | "df['wonly'] = (df['persistentReadBytes'] == 0)\n", 44 | "df['rw'] = ((df['persistentReadBytes'] > 0) & (df['persistentWriteBytes'] > 0))" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 7, 50 | "metadata": {}, 51 | "outputs": [], 52 | "source": [ 53 | "# Eliminate W-only queries\n", 54 | "df.query('ronly or rw', inplace=True)" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 9, 60 | "metadata": {}, 61 | "outputs": [], 62 | "source": [ 63 | "# Calculate hitrate\n", 64 | "df['hitrate'] = df['persistentReadBytesCache'] / df['persistentReadBytes']" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 20, 70 | "metadata": {}, 71 | "outputs": [], 72 | "source": [ 73 | "def ecdf(x):\n", 74 | " xs = np.sort(x)\n", 75 | " ys = np.arange(1, len(xs)+1)/float(len(xs))\n", 76 | " return xs, ys\n", 77 | "\n", 78 | "def weighted_ecdf(x, w):\n", 79 | " d = pd.DataFrame({'x': x, 'w': w})\n", 80 | " d.sort_values(by='x', inplace=True)\n", 81 | " xs = d['x']\n", 82 | " ys = np.cumsum(d['w']) / np.sum(d['w'])\n", 83 | " return xs,ys\n" 84 | ] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "execution_count": 23, 89 | "metadata": {}, 90 | "outputs": [ 91 | { 92 | "data": { 93 | "text/plain": [ 94 | "Text(0.5, 1.0, 'R-only queries')" 95 | ] 96 | }, 97 | "execution_count": 23, 98 | "metadata": {}, 99 | "output_type": "execute_result" 100 | }, 101 | { 102 | "data": { 103 | "image/png": "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z88v+o//+I+cYL5PRz//+c+zH3744cxgvocGb4qISESJi4vzrV+/fu2Rjre0tDBo0KAeXfO1114b3NraWjVt2rRGgAcffHDPcZZ5VDt27IhZsWJF0o4dO7rcATwYWlpa+N73vlcW7PdRi4WIiES8hx56KHP27NkTZsyYkX/aaadNrKqqipo5c2Z+UVFRYX5+ftFzzz03uP3chx9+ODM/P79o4sSJRZdccsnYd999N+m9994b/IMf/GBEQUFB0Zo1a+Iuu+yyMb/97W/TAV5//fWUwsLCovz8/KIrrrhiTENDgwEMHz78hO9+97vD2t9j2bJl8Z3rqq+vt8svv3xMfn5+UWFhYdEbb7yRAjBnzpz80tLS2IKCgqI//vGPyR1fs379+tgTTzyxID8/v+jWW28dlpiYeBLAm2++mXLWWWdNaD/vuuuuG/XQQw9lAvzlL39JPOWUUyZOmjSp8PTTT8/bvn37IIDp06dP/NrXvjZy8uTJhT/+8Y9zb7/99mF33313LsCaNWviZs2alTdp0qTCadOmTWyv/6mnnkrPy8ubNHHixKLi4uKJPf27UIuFiEiYq25sIRXYUlbH+FAX08Fdr6wYubGkJrE3r5k/JKX+gcun7jzaOU1NTVEFBQVFACNHjmx69913twCsWbMmceXKlWtyc3PbWlpaWLBgweaMjAzf3r17Y0499dSCa6655sDSpUvjf/GLXwxduHDh+qFDh7bu27cvOjc3t23OnDkHLrzwwqobbrihsuN71dfX2ze/+c2x77zzzoYpU6Y0XXrppWMeeOCB7LvvvrsUICsrq3Xt2rXr7r///uz7778/96WXXjpsT5af/exnOWbGxo0b1y5btiz+ggsuyNuyZcvqN954Y/OFF16Y11XLy7e//e1RN954Y9ktt9xSft9993W7cVxTU5PdeuutoxYsWLB52LBhrU888UT6nXfeOfzll1/eBtDc3GyrV69eB3D77bcPa3/djTfeOHrevHnbTzjhhKb3338/6eabbx61aNGijffff//Qd955Z+PYsWNb9u/fH93d+3emYCEiEuaa23wA7K9tCqtgESpH6gqZNWtWdW5ubht46y3cdtttIxYtWpQcFRVFaWlp7K5du2Lefvvt1Isuuqhy6NChrQDt5x/JihUr4keMGNE0ZcqUJoDrr7++/JFHHskBSgGuueaaSoDp06fXz58/P73z6//2t78lf+c73ykFOOmkkxqHDRvWvGrVqvjBgwcf8X2XLl2a/Ic//GELwDe/+c3yH/3oRyOOVuPKlSvjNm3alDB79ux8/2cnOzu7pf341VdfXdH5NVVVVVHLli1LvuKKKw5+SzU3NxtAcXFx7bXXXjvmsssuq7z22msrO7+2OwoWIiJyTLprWehriYmJvvb7jz/+eEZ5eXnMqlWr1sXFxbnhw4ef0NDQ0Ovd//Hx8Q4gJibGtba2Wm9dt6spvYMGDXI+38GPSFNTkwE452zChAkNy5cvX9/VtVJSUnydn2trayMlJaW1q4D2/PPP73j//feT5s+fnzZt2rSiJUuWrB0yZMhRA9hhtQd6ooiIhIjTshE9VVVVFZ2VldUSFxfn3njjjZQ9e/bEApx33nnVb7zxRnpJSUk0wL59+6IBkpOT26qrq//hZ+LUqVMbd+/eHbt69eo4gGeffTZz1qxZNYHW8bnPfa72ueeeywCvZWHv3r2xU6ZMaTzaa04++eTaJ554IgPgiSeeODiDY/z48U2bN29OaGhosP3790f/9a9/TQWYMmVKY0VFRcx7772XBF7gWLx48T+M9+goIyPDN2LEiOannnoqHbxWjoULFyaAN/Zi9uzZdQ8++OCe9PT01q1bt/Zo1o2ChYhI2GsPFr32C3G/d+ONN1asWLEiKT8/v+iZZ57JHDt2bCNAcXFx4x133LF31qxZBRMnTiz69re/PRLg2muvrXjooYeGFBYWFq1Zsyau/TqJiYnuscce23bFFVeMz8/PL4qKiuLOO+8MeGbF9773vVKfz2f5+flFX/rSl8Y//vjj2xISEo6aFB999NEd8+bNy8nPzy/avXv3wektEyZMaLnooosqCwoKJs2dO3fcpEmT6sFrNXnxxRe3fP/73x8xceLEokmTJhX9+c9/Tj7yO3heeOGFrb/97W+zJk6cWJSXlzfp1VdfHQzw3e9+d0R+fn5RXl7epFNOOaV2xowZDYF+XgBzEZaEi4uL3eLFi0NdhohIn9m/5zOy5p3Iokl3M+OKO47pGma2xDlXfLy1rFixYtvUqVP3H+91JHCJiYkn1dfXLwt1HR2tWLEia+rUqWO6OqYWCxGRsBdZvwDKwKZgISIS7py6QgaycGut6I6ChYhI2POChTMFCwl/ChYiImHPHyz0X7ZEAH2XioiEO9e+DIFaLCT8KViIiIS79jEWyhUSARQsRETCXHuecEoWQP/fNr3jBmiBePPNN1PefffdpN6v8NhoSW8RkXCnWSGH0bbph3v//fdTkpOT284555y63qjteKnFQkQk7LV3hShYHEl/2jYd4N13302ZPHly4ZgxYya/8MILaQDFxcUT//a3vyW0nzNt2rSJCxcuTHj22WezH3vssdz2a+3ZsyfmvPPOGz958uTCyZMnF77zzjtJAAsWLEhub+UpLCwsqqysDEoGUIuFiEi4c+2zQsIsWLz2zyMpXdur26aTU1TPJY8M6G3TAXbu3Bm3YsWKdWvXro2bM2fOxLlz56766le/uv/JJ5/MOu2003auXLkyrqmpKWrmzJkN1113XVlycnLbvffeuw+8Lpbbb79933nnnVe7adOm2PPOOy9v69ata375y18Oeeihh7afe+65dVVVVVEdN23rTQoWIiJhTytvdtTft00HuOyyyyqio6M54YQTmkaOHNm0fPny+Ouvv77ygQceGNrU1LTrsccey7rmmmu6XFr9448/Tt20adPBlo3a2troqqqqqBkzZtTeeeedI6+88sqKq6++unL8+PEKFiIiA1K4jrHopmWhr/WnbdOtU7eXmZGSkuKbNWtW9fPPPz94/vz5GcuWLeuytcM5x9KlS9clJiYelkh/+tOfllxyySVVr7/+etqsWbMKFixYsOmkk0466k6rx0JjLEREwp5W3uypSN42HeD3v/99eltbG2vWrInbuXNn3NSpUxsBvvWtb+3/l3/5l5FTp06ty87ObgNISUlpq6mpiW5/7emnn1593333HZxp0j4uY82aNXHTp09v+MlPflIyZcqUutWrVx91a/VjpWAhIhL2wrTFIoxF8rbpAMOHD2+eOnVq4Re/+MW8Bx98cHt768OsWbPqk5KS2m644YaD3SCXXXbZgQULFgxuH7w5b968nUuXLk3Kz88vGj9+/KSHH344G+DnP/95Tl5e3qT8/PyiQYMGucsvv7wq8D/RwGnbdBGRMFf+2XIyn/k8H019gDMuvemYrqFt0/uHbdu2DTrzzDMnbtmyZXV0dHT3LwgSbZsuIhLRNN1UvGmyM2bMKLz77rt3hzJUdEeDN0VEwl2EtSxLcNxyyy3lt9xyS3mo6+iOWixERMJeWK1j4fP5fGFRiISG/+//iFNVFSxERMKcHWywCIuf56vL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\n", 104 | "text/plain": [ 105 | "
" 106 | ] 107 | }, 108 | "metadata": { 109 | "needs_background": "light" 110 | }, 111 | "output_type": "display_data" 112 | } 113 | ], 114 | "source": [ 115 | "# Plot per-class hit-rate CDFs\n", 116 | "plt.plot(*ecdf(df[df['ronly']]['hitrate']), label='Fraction of queries')\n", 117 | "plt.plot(*weighted_ecdf(df[df['ronly']]['hitrate'], df[df['ronly']]['persistentReadBytes']), label='Fraction of bytes')\n", 118 | "plt.gca().set_ylim((0,1))\n", 119 | "plt.gca().legend(bbox_to_anchor=(1.04,1), loc=\"upper left\")\n", 120 | "plt.gca().set_xlabel('Cache hit rate')\n", 121 | "plt.gca().set_ylabel('Fraction')\n", 122 | "plt.gca().set_title('R-only queries')" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": 24, 128 | "metadata": {}, 129 | "outputs": [ 130 | { 131 | "data": { 132 | "text/plain": [ 133 | "Text(0.5, 1.0, 'RW queries')" 134 | ] 135 | }, 136 | "execution_count": 24, 137 | "metadata": {}, 138 | "output_type": "execute_result" 139 | }, 140 | { 141 | "data": { 142 | "image/png": "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O3ZErF69OnbHjh3drgDuDy0tLXz3u98t9ffnqMVCRCTYtXfcClGLxcE88MADKaeddtqE+fPn5x5//PETq6qqwo477rjcvLy8ybm5uXm///3vkzqOffDBB1Nyc3PzJk6cmHfhhRdmv/nmm7H/+Mc/kn74wx+OmjRpUl5+fn7kxRdfPPaJJ54YBvDSSy/FT548OS83Nzfv0ksvHdvQ0GAAmZmZ07797W+P7PiMVatWRXWtq76+3i655JKxubm5eZMnT857+eWX4wHOOOOM3JKSkqGTJk3Ke+211+I6v2f9+vVDZ86cOSk3NzfvlltuGRkTEzML4G9/+1v8qaeeOqHjuGuuuWb0Aw88kALw3nvvxRxzzDETp0yZMvnEE0/M2b59+xCAefPmTfzKV76SNXXq1Mk//elP02+99daRd9xxRzpAfn5+5IIFC3KmTJkyec6cORM76n/88ceH5eTkTJk4cWLe3LlzJx7u34VaLEREgl1wdd7c5/YXVmdtLK6J6ctz5o6Ir7/3khk7D3VMU1NT2KRJk/IAsrKymt58880tAPn5+TFr1qzJT09Pb2tpaeGVV17ZnJyc3L579+6IY489dtKVV15ZuXLlyqj77rsvY+nSpeszMjJa9+zZE56ent52xhlnVJ577rlV1113XUXnz6qvr7evf/3r2W+88caG6dOnN1100UVj77333rQ77rijBCA1NbV13bp1n919991pd999d/of//jHA9Zkueeee4abGRs3bly3atWqqHPOOSdny5Yta19++eXN5557bk53LS833XTT6Ouvv7705ptvLv/5z3/e48JxTU1Ndsstt4x+5ZVXNo8cObL10UcfHXbbbbdlPv/889sAmpubbe3atZ8B3HrrrSM73nf99dePWbRo0fZp06Y1LVmyJPYb3/jG6GXLlm28++67M954442N2dnZLWVlZYedZhUsRESCXUfnTTUyAwe/FbJgwYLq9PT0NvDmW/jWt741atmyZXFhYWGUlJQMLSwsjHj99dcTzjvvvIqMjIxWgI7jD2b16tVRo0aNapo+fXoTwLXXXlv+0EMPDQdKAK688soKgHnz5tUvXrx4WNf3f/jhh3Hf/OY3SwBmzZrVOHLkyOZPP/00Kikp6aCfu3Llyri///3vWwC+/vWvl//kJz8Zdaga16xZE7lp06bo0047Ldd37aSlpbV07L/i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\n", 143 | "text/plain": [ 144 | "
" 145 | ] 146 | }, 147 | "metadata": { 148 | "needs_background": "light" 149 | }, 150 | "output_type": "display_data" 151 | } 152 | ], 153 | "source": [ 154 | "plt.plot(*ecdf(df[df['rw']]['hitrate']), label='Fraction of queries')\n", 155 | "plt.plot(*weighted_ecdf(df[df['rw']]['hitrate'], df[df['rw']]['persistentReadBytes']), label='Fraction of bytes')\n", 156 | "plt.gca().set_ylim((0,1))\n", 157 | "plt.gca().legend(bbox_to_anchor=(1.04,1), loc=\"upper left\")\n", 158 | "plt.gca().set_xlabel('Cache hit rate')\n", 159 | "plt.gca().set_ylabel('Fraction')\n", 160 | "plt.gca().set_title('RW queries')" 161 | ] 162 | }, 163 | { 164 | "cell_type": "code", 165 | "execution_count": null, 166 | "metadata": {}, 167 | "outputs": [], 168 | "source": [] 169 | } 170 | ], 171 | "metadata": { 172 | "kernelspec": { 173 | "display_name": "Python 3 (ipykernel)", 174 | "language": "python", 175 | "name": "python3" 176 | }, 177 | "language_info": { 178 | "codemirror_mode": { 179 | "name": "ipython", 180 | "version": 3 181 | }, 182 | "file_extension": ".py", 183 | "mimetype": "text/x-python", 184 | "name": "python", 185 | "nbconvert_exporter": "python", 186 | "pygments_lexer": "ipython3", 187 | "version": "3.7.5" 188 | } 189 | }, 190 | "nbformat": 4, 191 | "nbformat_minor": 4 192 | } 193 | -------------------------------------------------------------------------------- /paper-results/classification.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import pandas as pd\n", 10 | "import matplotlib.pyplot as plt\n", 11 | "from matplotlib import colors\n", 12 | "import numpy as np\n", 13 | "%matplotlib inline" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 2, 19 | "metadata": {}, 20 | "outputs": [], 21 | "source": [ 22 | "# Load persistent data I/O stats of queries\n", 23 | "df = pd.read_parquet('../snowset-main.parquet', columns = ['persistentReadBytesCache', \n", 24 | " 'persistentReadBytesS3', \n", 25 | " 'persistentWriteBytesS3'],\n", 26 | " engine='fastparquet')" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 3, 32 | "metadata": {}, 33 | "outputs": [], 34 | "source": [ 35 | "# Calculate total amount of persistent data bytes read and written\n", 36 | "df['persistentReadBytes'] = df['persistentReadBytesCache'] + df['persistentReadBytesS3']\n", 37 | "# Cache is write-through\n", 38 | "df['persistentWriteBytes'] = df['persistentWriteBytesS3'] " 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 4, 44 | "metadata": {}, 45 | "outputs": [ 46 | { 47 | "data": { 48 | "text/plain": [ 49 | "Text(0.5, 1.0, 'Persistent Data I/O scatter-plot')" 50 | ] 51 | }, 52 | "execution_count": 4, 53 | "metadata": {}, 54 | "output_type": "execute_result" 55 | }, 56 | { 57 | "data": { 58 | "image/png": "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\n", 59 | "text/plain": [ 60 | "
" 61 | ] 62 | }, 63 | "metadata": { 64 | "needs_background": "light" 65 | }, 66 | "output_type": "display_data" 67 | } 68 | ], 69 | "source": [ 70 | "# Scatter-plot for persistent read/write bytes\n", 71 | "def logScatterPlot(x, y):\n", 72 | " x_bins = np.logspace(np.log10(min(x)), np.log10(max(x)), 150)\n", 73 | " y_bins = np.logspace(np.log10(min(y)), np.log10(max(y)), 150)\n", 74 | " \n", 75 | " Z, xedges, yedges = np.histogram2d(x,y,[x_bins,y_bins])\n", 76 | " p = plt.pcolormesh(xedges, yedges, Z.T, norm=colors.LogNorm(vmin=1, vmax=Z.max()),\n", 77 | " cmap='PuBu')\n", 78 | " plt.gcf().colorbar(p)\n", 79 | "\n", 80 | " plt.yscale('log')\n", 81 | " plt.xscale('log')\n", 82 | " \n", 83 | " return plt.gca()\n", 84 | "\n", 85 | "ax = logScatterPlot(df['persistentReadBytes'] + 1, df['persistentWriteBytes'] + 1)\n", 86 | "ax.set_xlabel('Persistent Bytes Read + 1')\n", 87 | "ax.set_ylabel('Persistent Bytes Written + 1')\n", 88 | "ax.set_title('Persistent Data I/O scatter-plot')" 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": 5, 94 | "metadata": {}, 95 | "outputs": [], 96 | "source": [ 97 | "# Assign query classes\n", 98 | "df['ronly'] = (df['persistentWriteBytes'] == 0).astype('int')\n", 99 | "df['wonly'] = (df['persistentReadBytes'] == 0).astype('int')\n", 100 | "df['rw'] = ((df['persistentReadBytes'] > 0) & (df['persistentWriteBytes'] > 0)).astype('int')" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 6, 106 | "metadata": {}, 107 | "outputs": [ 108 | { 109 | "data": { 110 | "text/plain": [ 111 | "ronly 20253279\n", 112 | "wonly 10394740\n", 113 | "rw 39814996\n", 114 | "dtype: int64" 115 | ] 116 | }, 117 | "execution_count": 6, 118 | "metadata": {}, 119 | "output_type": "execute_result" 120 | } 121 | ], 122 | "source": [ 123 | "# Compute per-class query counts\n", 124 | "df[['ronly', 'wonly', 'rw']].sum()" 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": null, 130 | "metadata": {}, 131 | "outputs": [], 132 | "source": [] 133 | } 134 | ], 135 | "metadata": { 136 | "kernelspec": { 137 | "display_name": "Python 3 (ipykernel)", 138 | "language": "python", 139 | "name": "python3" 140 | }, 141 | "language_info": { 142 | "codemirror_mode": { 143 | "name": "ipython", 144 | "version": 3 145 | }, 146 | "file_extension": ".py", 147 | "mimetype": "text/x-python", 148 | "name": "python", 149 | "nbconvert_exporter": "python", 150 | "pygments_lexer": "ipython3", 151 | "version": "3.7.5" 152 | } 153 | }, 154 | "nbformat": 4, 155 | "nbformat_minor": 4 156 | } 157 | -------------------------------------------------------------------------------- /paper-results/intdata-characteristics.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "# Intermediate data characteristics\n", 10 | "import pandas as pd\n", 11 | "import matplotlib.pyplot as plt\n", 12 | "from matplotlib import colors\n", 13 | "import numpy as np\n", 14 | "%matplotlib inline" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 2, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "# Load intermediate data I/O characteristics\n", 24 | "df = pd.read_parquet('~/snowflake-analysis/snowset-main.parquet', columns = ['intDataNetSentBytes', \n", 25 | " 'intDataNetSentRequests',\n", 26 | " 'persistentReadBytesCache', \n", 27 | " 'persistentReadBytesS3', \n", 28 | " 'persistentWriteBytesS3',\n", 29 | " 'userCpuTime',\n", 30 | " 'systemCpuTime'],\n", 31 | " engine='fastparquet')" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 3, 37 | "metadata": {}, 38 | "outputs": [], 39 | "source": [ 40 | "# Calculate total amount of persistent data bytes read and written\n", 41 | "df['persistentReadBytes'] = df['persistentReadBytesCache'] + df['persistentReadBytesS3']\n", 42 | "# Cache is write-through\n", 43 | "df['persistentWriteBytes'] = df['persistentWriteBytesS3'] \n", 44 | "# Assign query classes\n", 45 | "df['ronly'] = (df['persistentWriteBytes'] == 0)\n", 46 | "df['wonly'] = (df['persistentReadBytes'] == 0)\n", 47 | "df['rw'] = ((df['persistentReadBytes'] > 0) & (df['persistentWriteBytes'] > 0))" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": 4, 53 | "metadata": {}, 54 | "outputs": [], 55 | "source": [ 56 | "def ecdf(x):\n", 57 | " xs = np.sort(x)\n", 58 | " ys = np.arange(1, len(xs)+1)/float(len(xs))\n", 59 | " return xs, ys" 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": 5, 65 | "metadata": {}, 66 | "outputs": [ 67 | { 68 | "data": { 69 | "text/plain": [ 70 | "Text(0, 0.5, 'Fraction of Queries')" 71 | ] 72 | }, 73 | "execution_count": 5, 74 | "metadata": {}, 75 | "output_type": "execute_result" 76 | }, 77 | { 78 | "data": { 79 | "image/png": "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\n", 80 | "text/plain": [ 81 | "
" 82 | ] 83 | }, 84 | "metadata": { 85 | "needs_background": "light" 86 | }, 87 | "output_type": "display_data" 88 | } 89 | ], 90 | "source": [ 91 | "# Plot per-class CDFs of intermediate data exchanged over network \n", 92 | "plt.plot(*ecdf(df[df['ronly']]['intDataNetSentBytes']), label='R-only')\n", 93 | "plt.plot(*ecdf(df[df['wonly']]['intDataNetSentBytes']), label='W-only')\n", 94 | "plt.plot(*ecdf(df[df['rw']]['intDataNetSentBytes']), label='RW')\n", 95 | "plt.gca().set_xscale('log')\n", 96 | "plt.gca().set_xlim((1,10**14))\n", 97 | "plt.gca().legend(bbox_to_anchor=(1.04,1), loc=\"upper left\")\n", 98 | "plt.gca().set_xlabel('Intermediate Data Exchanged (Bytes)')\n", 99 | "plt.gca().set_ylabel('Fraction of Queries')" 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": 6, 105 | "metadata": {}, 106 | "outputs": [ 107 | { 108 | "data": { 109 | "text/plain": [ 110 | "Text(0, 0.5, 'Fraction of Queries')" 111 | ] 112 | }, 113 | "execution_count": 6, 114 | "metadata": {}, 115 | "output_type": "execute_result" 116 | }, 117 | { 118 | "data": { 119 | "image/png": "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\n", 120 | "text/plain": [ 121 | "
" 122 | ] 123 | }, 124 | "metadata": { 125 | "needs_background": "light" 126 | }, 127 | "output_type": "display_data" 128 | } 129 | ], 130 | "source": [ 131 | "# Plot per-class CDFs of number of network requests for intermediate data exchange \n", 132 | "plt.plot(*ecdf(df[df['ronly']]['intDataNetSentRequests']), label='R-only')\n", 133 | "plt.plot(*ecdf(df[df['wonly']]['intDataNetSentRequests']), label='W-only')\n", 134 | "plt.plot(*ecdf(df[df['rw']]['intDataNetSentRequests']), label='RW')\n", 135 | "plt.gca().set_xscale('log')\n", 136 | "plt.gca().set_xlim((1,10**12))\n", 137 | "plt.gca().legend(bbox_to_anchor=(1.04,1), loc=\"upper left\")\n", 138 | "plt.gca().set_xlabel('Number of requests')\n", 139 | "plt.gca().set_ylabel('Fraction of Queries')" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": 7, 145 | "metadata": {}, 146 | "outputs": [ 147 | { 148 | "data": { 149 | "text/plain": [ 150 | "Text(0, 0.5, 'Fraction of Queries')" 151 | ] 152 | }, 153 | "execution_count": 7, 154 | "metadata": {}, 155 | "output_type": "execute_result" 156 | }, 157 | { 158 | "data": { 159 | "image/png": "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3znyO3x11Ffpk93+d2tFRKTrULLdW9uWeu8nXLtH8artlVz6p9lsr6jjvovHc+bYlhNmVUMVz6x8hkeXPsrGyo0MyBmg8YpFRA5yGl5ob9TshCXPQv4QaHJ79+ONZVxw33tU18X5yxXHt5ho6+J1PLjoQU578jTunHMnhVmF/OqUX/HCeS/wtdFfU6IVEUlSOBweP3r06DEjRow4Ytq0acN37NgRBjjttNMO+/Of/5zXWG/IkCFjr7/++r6N62ecccZhjzzySF5LbQZNyTZZ8Rg8dTmUroUv3r2reH1xNd/844dkp0V4+nsncsyg/D12c87x5ro3OffZc7l7wd1M6DOBx85+jJlnzeT0IafrmayIyF5KT09PLFu27JOVK1cuycvLi911112FACeccELlu+++mwOwZcuWcFZWVnz27NnZjfstWLAg+9RTT92rkaM6ipJtsl6/BYregLN/AcNOAbyRoL7/+ALiCcdjV0xicI/sPXYpKi3iitev4Adv/4DMSCYPnv4gd0+7myMLj0zFJxAROej4M/6kAZx00kmVc+bMyQZ46623cs4444yy4uLiaCKRYNmyZWnp6emJQYMGfWZ0qc6gZ7bJcA5WvgZDTtpjCr2H/rWGBet38vuvH7NHoq1uqOb+hfcz85OZZEezuXHijXx11Fc1lKKIHFT+693/GlhUWtShU+wNzx9efdvk25Ka4CAWizFr1qzcyy+/fAfAlClTqlesWJFZW1tr7777bs6pp55asWbNmvQFCxZkzJ49O2v8+PFVHRnr3tBv//Y4B2/cCsUr4Zhv7CpeV1zFb99YweljevPFcf12lf9r07+47f3b+LTqU84fcT4/OPYH5Gfkt9CwiIjsi7q6utDo0aPHbN26NXrYYYfVfulLXyoHyMzMdCNGjKh99913s+bOnZt96623bikqKkp/5513chYsWJB14oknpuQWMijZtu8fv4R3f+td0U7+/q7i215YStiMn557BAA7anbwizm/4OU1LzO0+1AePvNhxvcen6qoRUQCl+wVaEdrfGZbUVERmjp16og77rij180337wNYOLEiZWzZs3KqaqqChcWFsanTJlS9bvf/a7X4sWLs6699trtqYgX9My2bfVVsGAm9DsGvvDrXfPVzl1bwhtLt/K9U4fTPcvx4KIH+eIzX+SNdW9w9bir+dsX/6ZEKyISsNzc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\n", 160 | "text/plain": [ 161 | "
" 162 | ] 163 | }, 164 | "metadata": { 165 | "needs_background": "light" 166 | }, 167 | "output_type": "display_data" 168 | } 169 | ], 170 | "source": [ 171 | "# Plot per-class CDFs of network request sizes for intermediate data exchange\n", 172 | "# Plot per-class CDFs of number of network requests for intermediate data exchange \n", 173 | "plt.plot(*ecdf((df[df['ronly']]['intDataNetSentBytes'] / df[df['ronly']]['intDataNetSentRequests'])\n", 174 | " .replace([np.inf, -np.inf, np.nan], 0)), label='R-only')\n", 175 | "plt.plot(*ecdf((df[df['wonly']]['intDataNetSentBytes'] / df[df['wonly']]['intDataNetSentRequests'])\n", 176 | " .replace([np.inf, -np.inf, np.nan], 0)), label='W-only')\n", 177 | "plt.plot(*ecdf((df[df['rw']]['intDataNetSentBytes'] / df[df['rw']]['intDataNetSentRequests'])\n", 178 | " .replace([np.inf, -np.inf, np.nan], 0)), label='RW')\n", 179 | "plt.gca().set_xlim((0,18000))\n", 180 | "plt.gca().legend(bbox_to_anchor=(1.04,1), loc=\"upper left\")\n", 181 | "plt.gca().set_xlabel('Bytes per request')\n", 182 | "plt.gca().set_ylabel('Fraction of Queries')" 183 | ] 184 | }, 185 | { 186 | "cell_type": "code", 187 | "execution_count": 8, 188 | "metadata": {}, 189 | "outputs": [ 190 | { 191 | "data": { 192 | "text/plain": [ 193 | "(1, 100000000000000)" 194 | ] 195 | }, 196 | "execution_count": 8, 197 | "metadata": {}, 198 | "output_type": "execute_result" 199 | }, 200 | { 201 | "data": { 202 | "image/png": "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\n", 203 | "text/plain": [ 204 | "
" 205 | ] 206 | }, 207 | "metadata": { 208 | "needs_background": "light" 209 | }, 210 | "output_type": "display_data" 211 | } 212 | ], 213 | "source": [ 214 | "# Scatter-plot of CPU-time vs Intermediate data exchanged\n", 215 | "def logScatterPlot(x, y):\n", 216 | " x_bins = np.logspace(np.log10(min(x)), np.log10(max(x)), 150)\n", 217 | " y_bins = np.logspace(np.log10(min(y)), np.log10(max(y)), 150)\n", 218 | " \n", 219 | " Z, xedges, yedges = np.histogram2d(x,y,[x_bins,y_bins])\n", 220 | " p = plt.pcolormesh(xedges, yedges, Z.T, norm=colors.LogNorm(vmin=1, vmax=Z.max()),\n", 221 | " cmap='Greens')\n", 222 | " plt.gcf().colorbar(p)\n", 223 | "\n", 224 | " plt.yscale('log')\n", 225 | " plt.xscale('log')\n", 226 | " \n", 227 | " return plt.gca()\n", 228 | "\n", 229 | "ax = logScatterPlot(df['userCpuTime'] + df['systemCpuTime'] + 1, df['intDataNetSentBytes'] + 1)\n", 230 | "ax.set_xlabel('Total CPU Time')\n", 231 | "ax.set_ylabel('Intermediate Data Exchanged')\n", 232 | "ax.set_title('CPU time vs Intermediate data scatter-plot')\n", 233 | "ax.set_ylim((1,10**14))\n", 234 | "ax.set_ylim((1,10**14))" 235 | ] 236 | }, 237 | { 238 | "cell_type": "code", 239 | "execution_count": null, 240 | "metadata": {}, 241 | "outputs": [], 242 | "source": [] 243 | } 244 | ], 245 | "metadata": { 246 | "kernelspec": { 247 | "display_name": "Python 3 (ipykernel)", 248 | "language": "python", 249 | "name": "python3" 250 | }, 251 | "language_info": { 252 | "codemirror_mode": { 253 | "name": "ipython", 254 | "version": 3 255 | }, 256 | "file_extension": ".py", 257 | "mimetype": "text/x-python", 258 | "name": "python", 259 | "nbconvert_exporter": "python", 260 | "pygments_lexer": "ipython3", 261 | "version": "3.7.5" 262 | } 263 | }, 264 | "nbformat": 4, 265 | "nbformat_minor": 4 266 | } 267 | -------------------------------------------------------------------------------- /profile.md: -------------------------------------------------------------------------------- 1 | ## Profiling Stats 2 | 3 | The dataset contains high-fidelity, coarse-grained profiling statistics at a per-query level which can potentially give insight into where queries are spending their time. 4 | 5 | ### Overview 6 | 7 | A profiler thread is forked in every worker process to monitor the activity of all the threads of the worker process. Every 10msec, the profiler thread wakes up and scans all active worker threads to see their states and records various statistics / metrics. 8 | 9 | The profiling time breakdowns are available along two dimensions: 1.) by resource and 2.) by operator 10 | 11 | ### By Resource (prof\*) 12 | 13 | These statistics provide a breakdown of CPU time into the following: 1.) Time during which CPU is busy (**profCpu**) 2.) Time during which CPU is idle (**profIdle**) and 3.) Time during which CPU is blocked on various resources/activities (**prof\*** other than **profCpu** and **profIdle**). The accounting for these stats is done as follows: 14 | 15 | Every time the profiler thread wakes up (every 10msec) it will detect how many threads are running vs waiting for a resource (like disk I/O) and compute metrics like CPU usage and wasted CPU time waiting on resources or CPUs idle. Every active worker thread will update its state to report if it is __running__ or __waiting for a resource__ (and if so what resource it is waiting on). Therefore looking at the state itself doesn't say if a thread is currently scheduled on a CPU and running. The OS may have it context switched out even if it thinks it is running. Computing wait time is therefore done by estimations, assuming the worker process is given 100% of the CPUs of its DOP (maximum number of cores a worker process of the query can use. This number is available in the **perServerCores** field in the dataset). 16 | 17 | A worker forks more threads than its DOP. A thread waiting for a resource is not necessarily counted as a blocked state if all the CPUs are in use by other worker threads. In that case the workload is still CPU bound. 18 | 19 | * If there's more threads claiming they are running than the DOP, then we can assume they are sharing the CPUs and just context switch. In that case we report 100% busy. (profCpu is incremented to account for the full time slice) 20 | * If there's fewer threads claiming they are __running__ than the DOP, then we assume some CPUs are not used. In that case, the threads in __waiting__ state are examined, all the wait types (prof\* other than profCpu/profIdle) are tallied, and equally assigned a portion of the unused CPUs. The logic is that if these wait states did not exist, these threads would grab a portion of that unused CPU. 21 | * If there's fewer threads __waiting__ or __running__ than the DOP, then there's more CPUs than can be used: These are reported as IDLE CPU time. 22 | 23 | The full list of __by resource__ breakdown fields are given below: 24 | 25 | Column | Description | Units | Datatype 26 | :------:|:-----:|:-----:|:-----: 27 | **profIdle**|CPU Idle time|Milliseconds|int64 28 | **profCpu**|CPU busy time|Milliseconds|int64 29 | **profPersistentReadCache**|Time blocked on persistent data read from cache|Milliseconds|int64 30 | **profPersistentWriteCache**|Time blocked on persistent data write to cache|Milliseconds|int64 31 | **profPersistentReadS3**|Time blocked on persistent data read from S3|Milliseconds|int64 32 | **profPersistentWriteS3**|Time blocked on persistent data write to S3|Milliseconds|int64 33 | **profIntDataReadLocalSSD**|Time blocked on intermediate data read from local SSD|Milliseconds|int64 34 | **profIntDataWriteLocalSSD**|Time blocked on intermediate data write to local SSD|Milliseconds|int64 35 | **profIntDataReadS3**|Time blocked on intermediate data read from S3|Milliseconds|int64 36 | **profIntDataWriteS3**|Time blocked on intermediate data write to S3|Milliseconds|int64 37 | **profRemoteExtRead**|?|Milliseconds|int64 38 | **profRemoteExtWrite**|?|Milliseconds|int64 39 | **profResWriteS3**|Time blocked on writing result to S3|Milliseconds|int64 40 | **profFsMeta**|Time blocked on filesystem metadata operations|Milliseconds|int64 41 | **profDataExchangeNet**|Time blocked on network for intermediate data exchange|Milliseconds|int64 42 | **profDataExchangeMsg**|Time blocked on network for intermediate data exchange|Milliseconds|int64 43 | **profControlPlaneMsg**|Time blocked on network for communication with control plane (cloud services)|Milliseconds|int64 44 | **profOs**|CPU time spent in kernel mode processing|Milliseconds|int64 45 | **profMutex**|CPU time spent contending for mutexes|Milliseconds|int64 46 | **profSetup**|Time spent in worker process setup|Milliseconds|int64 47 | **profSetupMesh**|Time spent in setting up the mesh of network connections among worker processes|Milliseconds|int64 48 | **profTeardown**|Time spent in teardown operartions|Milliseconds|int64 49 | 50 | 51 | ### By Operator (prof\*Rso) 52 | 53 | These statictics give a breakdown of time based on the operator being processed (scan, filter, join etc..). The full list of these fields is given in the table below. Note that within each operator different resources may be consumed. (for example within profScanRso, some of that time may be spent on CPU, some of it may be spent blocked on disk I/O etc..) Unfortunately and internal breakdown of how much time is spent doing what __within each operator__ is not available in the dataset. 54 | 55 | Column | Description | Units | Datatype 56 | :------:|:-----:|:-----:|:-----: 57 | **profScanRso**|Scan operators profiled time|Milliseconds|int64 58 | **profXtScanRso**|External scan operators profiled time|Milliseconds|int64 59 | **profProjRso**|Projection operators profiled time|Milliseconds|int64 60 | **profSortRso**|Sort operators profiled time|Milliseconds|int64 61 | **profFilterRso**|Filter operators profiled time|Milliseconds|int64 62 | **profResRso**|Result operators profiled time|Milliseconds|int64 63 | **profDmlRso**|DML operators profiled time|Milliseconds|int64 64 | **profHjRso**|Hash-join operators profiled time|Milliseconds|int64 65 | **profBufRso**|Buffer operators profiled time|Milliseconds|int64 66 | **profFlatRso**|Flatten operators profiled time|Milliseconds|int64 67 | **profBloomRso**|Bloom filter operators profiled time|Milliseconds|int64 68 | **profAggRso**|Aggregate operators profiled time|Milliseconds|int64 69 | **profBandRso**|Band-join operators profiled time|Milliseconds|int64 70 | **profPercentileRso**|Percentile operators profiled time|Milliseconds|int64 71 | **profUdtfRso**|User defined table operators profiled time|Milliseconds|int64 72 | **profOtherRso**|Other operators profiled time|Milliseconds|int64 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /schema.md: -------------------------------------------------------------------------------- 1 | ## Main dataset 2 | 3 | _Note: Some of the columns in the dataset have missing values which are denoted by "\N" in the CSV version_ 4 | 5 | Each row corresponds to one unique query with the columns representing various characteristics pertaining to that query. The queryId column contains a unique 64-bit identifier for each query. For descriptions of the various columns along with details like units and datatypes, please refer to the following table: 6 | 7 | Column | Description | Units | Datatype 8 | :------:|:-----:|:-----:|:-----: 9 | **queryId**|Query identifier (anonymized). Uniquely identifies a given query. ||int64 10 | **warehouseId**|Identifier of warehouse (anonymized) in which the query ran. Queries that ran in the same warehouse will have the same warehouseId||int64 11 | **databaseId**|Unique identifier of database that this query is associated with. (Note: missing values "\N" possible )||string 12 | **createdTime**|Timestamp at which query is created / enters the system||UTC Timestamp 13 | **endTime**|Timestamp at which query is fully complete||UTC Timestamp 14 | **durationTotal**|Total end-to-end duration of query|Milliseconds|int64 15 | **durationExec**|Time spent for actual query execution (worker processes running)|Milliseconds|int64 16 | **durationControlPlane**|Time spent in control plane operations|Milliseconds|int64 17 | **durationCompiling**|Time spent for query compilation|Milliseconds|int64 18 | **execTime**|Query compute execution duration.||int64 19 | **scheduleTime**|Time spent for query to start executing after it entered the system||int64 20 | **serverCount**|Number of servers used for query execution.||int32 21 | **warehouseSize**|Size of warehouse in which this query is executing||int32 22 | **perServerCores**|Maximum number of cores this query is allowed to use for compute||int32 23 | **persistentReadBytesS3**|Persistent data bytes read from S3 (size post-compression)|Bytes|int64 24 | **persistentReadRequestsS3**|Total number of Persistent data read requests to S3||int64 25 | **persistentReadBytesCache**|Persistent data bytes read from cache (persistent data is opportunisitically cached in the eph. storage system) (size post-compression)|Bytes|int64 26 | **persistentReadRequestsCache**|Total number of Persistent data read requests from cache (persistent data is opportunistically cached in the eph. storage system)||int64 27 | **persistentWriteBytesCache**|Persistent data bytes written to cache (persistent data is opportunistically cached in the eph. storage system) (size post-compression)|Bytes|int64 28 | **persistentWriteRequestsCache**|Total number of Persistent data write requests to cache (persistent data is opportunistically cached in the eph. storage system)||int64 29 | **persistentWriteBytesS3**|Persistent data bytes written to S3 (size post-compression)|Bytes|int64 30 | **persistentWriteRequestsS3**|Total number of Persistent data write requests to S3 (persistent data is opportunistically cached in the eph. storage system)||int64 31 | **intDataWriteBytesLocalSSD**|Intermediate data bytes spilled to Local SSD (size post-compression)|Bytes|int64 32 | **intDataWriteRequestsLocalSSD**|Total number of intermediate data write requests to Local SSD||int64 33 | **intDataReadBytesLocalSSD**|Intermediate data bytes read from Local SSD (size post-compression)|Bytes|int64 34 | **intDataReadRequestsLocalSSD**|Total number of intermediate data read requests from Local SSD||int64 35 | **intDataWriteBytesS3**|Intermediate data bytes spilled to S3 (size post-compression)|Bytes|int64 36 | **intDataWriteRequestsS3**|Total number of intermediate data write requests to S3||int64 37 | **intDataReadBytesS3**|Intermediate data bytes read from Local SSD (size post-compression)|Bytes|int64 38 | **intDataReadRequestsS3**|Total number of intermediate data read requests from S3||int64 39 | **intDataWriteBytesUncompressed**|Intermediate data bytes spilled to Local SSD / S3 (size pre-compression)|Bytes|int64 40 | **readBytesRemoteExternal**|?||int64 41 | **readRequestsRemoteExternal**|?||int64 42 | **intDataNetReceivedBytes**|Intermediate data exchange over network recveived bytes (size post-compression)|Bytes|int64 43 | **intDataNetSentBytes**|Intermediate data exchange over network sent bytes (size post-compression)|Bytes|int64 44 | **intDataNetSentRequests**|Intermediate data exchange total number of network requests||int64 45 | **intDataNetSentBytesUncompressed**|Intermediate data exchange over network sent bytes (size pre-compression)|Bytes|int64 46 | **producedRows**|Number of produced rows in output set.||int64 47 | **returnedRows**|Number of rows returned by this job||int64 48 | **fileStolenCount**|Total number of files stolen by worker nodes (work stealing).||int64 49 | **remoteSeqScanFileOps**|?|| 50 | **localSeqScanFileOps**|Sequential scan file operations.||int64 51 | **localWriteFileOps**|Local write file operations.||int64 52 | **remoteSkipScanFileOps**|Number of times fdn files were scanned||int64 53 | **remoteWriteFileOps**|?|| 54 | **filesCreated**|Number of files created by query.||int64 55 | **scanAssignedBytes**|Should be equivalent to scanBytes|Bytes|int64 56 | **scanAssignedFiles**|Total number of files to be scanned after pruning|Bytes|int64 57 | **scanBytes**|Total number of bytes scanned from files|Bytes|int64 58 | **scanFiles**|Same as scanAssignedFiles|Bytes|int64 59 | **scanOriginalFiles**|Total number of files in the table before pruning||int64 60 | **userCpuTime**|User CPU time summed across all worker processes|Microseconds|int64 61 | **systemCpuTime**|Kernel CPU time summed across all worker processes|Microseconds|int64 62 | **memoryUsed**|Memory used across all worker processes|Bytes|int64 63 | **profIdle**|CPU Idle time|Milliseconds|int64 64 | **profCpu**|CPU busy time|Milliseconds|int64 65 | **profPersistentReadCache**|Time blocked on persistent data read from cache|Milliseconds|int64 66 | **profPersistentWriteCache**|Time blocked on persistent data write to cache|Milliseconds|int64 67 | **profPersistentReadS3**|Time blocked on persistent data read from S3|Milliseconds|int64 68 | **profPersistentWriteS3**|Time blocked on persistent data write to S3|Milliseconds|int64 69 | **profIntDataReadLocalSSD**|Time blocked on intermediate data read from local SSD|Milliseconds|int64 70 | **profIntDataWriteLocalSSD**|Time blocked on intermediate data write to local SSD|Milliseconds|int64 71 | **profIntDataReadS3**|Time blocked on intermediate data read from S3|Milliseconds|int64 72 | **profIntDataWriteS3**|Time blocked on intermediate data write to S3|Milliseconds|int64 73 | **profRemoteExtRead**|?|Milliseconds|int64 74 | **profRemoteExtWrite**|?|Milliseconds|int64 75 | **profResWriteS3**|Time blocked on writing result to S3|Milliseconds|int64 76 | **profFsMeta**|Time blocked on filesystem metadata operations|Milliseconds|int64 77 | **profDataExchangeNet**|Time blocked on network for intermediate data exchange|Milliseconds|int64 78 | **profDataExchangeMsg**|Time blocked on network for intermediate data exchange|Milliseconds|int64 79 | **profControlPlaneMsg**|Time blocked on network for communication with control plane (cloud services)|Milliseconds|int64 80 | **profOs**|CPU time spent in kernel mode processing|Milliseconds|int64 81 | **profMutex**|CPU time spent contending for mutexes|Milliseconds|int64 82 | **profSetup**|Time spent in worker process setup|Milliseconds|int64 83 | **profSetupMesh**|Time spent in setting up the mesh of network connections among worker processes|Milliseconds|int64 84 | **profTeardown**|Time spent in teardown operartions|Milliseconds|int64 85 | **profScanRso**|Scan operators profiled time|Milliseconds|int64 86 | **profXtScanRso**|External scan operators profiled time|Milliseconds|int64 87 | **profProjRso**|Projection operators profiled time|Milliseconds|int64 88 | **profSortRso**|Sort operators profiled time|Milliseconds|int64 89 | **profFilterRso**|Filter operators profiled time|Milliseconds|int64 90 | **profResRso**|Result operators profiled time|Milliseconds|int64 91 | **profDmlRso**|DML operators profiled time|Milliseconds|int64 92 | **profHjRso**|Hash-join operators profiled time|Milliseconds|int64 93 | **profBufRso**|Buffer operators profiled time|Milliseconds|int64 94 | **profFlatRso**|Flatten operators profiled time|Milliseconds|int64 95 | **profBloomRso**|Bloom filter operators profiled time|Milliseconds|int64 96 | **profAggRso**|Aggregate operators profiled time|Milliseconds|int64 97 | **profBandRso**|Band-join operators profiled time|Milliseconds|int64 98 | **profPercentileRso**|Percentile operators profiled time|Milliseconds|int64 99 | **profUdtfRso**|User defined table operators profiled time|Milliseconds|int64 100 | **profOtherRso**|Other operators profiled time|Milliseconds|int64 101 | --------------------------------------------------------------------------------