Skip to content

Instantly share code, notes, and snippets.

@jmensch1
Created May 6, 2020 13:04
Show Gist options
  • Save jmensch1/992f23c5d0c77d74cc933b3fbe87f071 to your computer and use it in GitHub Desktop.
Save jmensch1/992f23c5d0c77d74cc933b3fbe87f071 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from sqlalchemy import create_engine\n",
"from sqlalchemy.sql import text\n",
"import pandas as pd\n",
"import sqlparse\n",
"import os\n",
"import timeit\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### SQL Setup"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"engine = create_engine(os.environ['DB_CONNECTION_STRING'])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def exec_sql(sql):\n",
" with engine.connect() as conn:\n",
" return conn.execute(text(sql))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def print_sql(sql):\n",
" print(sqlparse.format(sql, reindent=True, keyword_case='upper'))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# contains 2015 - 2020\n",
"TABLE = 'ingest_staging_table'\n",
"\n",
"# all queries get these fields from the DB\n",
"FIELDS = ['requesttype', 'nc', 'createddate', 'srnumber', 'latitude', 'longitude']\n",
"\n",
"# date range for all queries\n",
"START_DATE = '2019-01-01'\n",
"END_DATE = '2020-01-01'\n",
"\n",
"# these are all the valid NC codes \n",
"ALL_NCS = [\n",
" 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, \n",
" 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, \n",
" 28, 29, 30, 32, 33, 34, 36, 37, 38, 39, 40, \n",
" 41, 42, 43, 44, 46, 47, 48, 50, 52, 53, 54, \n",
" 55, 58, 60, 61, 62, 63, 64, 66, 67, 68, 70, \n",
" 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, 84, \n",
" 86, 87, 88, 90, 91, 92, 93, 94, 95, 96, 97, \n",
" 99, 100, 101, 102, 104, 109, 110, 111, 112, \n",
" 113, 114, 115, 118, 119, 120, 121, 123, 124, \n",
" 125, 126, 127, 128\n",
"]\n",
"\n",
"ALL_RTS = [\n",
" \"Bulky Items\",\"Graffiti Removal\",\"Homeless Encampment\",\n",
" \"Illegal Dumping Pickup\",\"Dead Animal Removal\",\"Electronic Waste\",\n",
" \"Single Streetlight Issue\",\"Multiple Streetlight Issue\",\n",
" \"Metal/Household Appliances\",\"Feedback\",\"Other\"\n",
"]\n",
"\n",
"# run queries for each of these values\n",
"NUMBER_OF_NCS = [1, 3, 6, 10, 15, 20, 30, 50, 70, 90, 100]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Timing helpers"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def time_process(variable, values, process, runs=7):\n",
" times = []\n",
" for value in values:\n",
" timer = timeit.Timer(lambda: process(value))\n",
" run_times = timer.repeat(repeat=runs, number=1)\n",
" avg_time = round(sum(run_times) / len(run_times), 4)\n",
" print(f'{variable} = {value} ===> average {avg_time} seconds over {runs} runs')\n",
" times.append(avg_time)\n",
" return times"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def time_processes(variable, values, processes):\n",
" times = {}\n",
" for name, process in processes.items():\n",
" print(name)\n",
" times[name] = time_process(variable, values, process)\n",
" return pd.DataFrame(times, index=pd.Index(values, name=variable))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def chart_times(times, title):\n",
" chart = times.plot.bar(figsize=(10, 6))\n",
" chart.set_ylabel('execution time (secs)', fontsize=16)\n",
" chart.set_title(title, fontsize=20)\n",
" chart.xaxis.label.set_size(16)\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### IN query"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"SELECT requesttype,\n",
" nc,\n",
" createddate,\n",
" srnumber,\n",
" latitude,\n",
" longitude\n",
"FROM ingest_staging_table\n",
"WHERE createddate > '2019-01-01'\n",
" AND createddate < '2020-01-01'\n",
" AND nc IN (4,\n",
" 5,\n",
" 6)\n"
]
}
],
"source": [
"def in_query(ncList):\n",
" return f\"\"\"\n",
" SELECT {(', ').join(FIELDS)}\n",
" FROM {TABLE}\n",
" WHERE \n",
" createddate > '{START_DATE}' AND \n",
" createddate < '{END_DATE}' AND \n",
" nc IN ({(', ').join([str(nc) for nc in ncList])})\n",
" \"\"\"\n",
"\n",
"# example with ncList = [4, 5, 6]\n",
"print_sql(in_query([4, 5, 6]))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"IN query\n",
"number of NCs = 1 ===> average 0.6142 seconds over 7 runs\n",
"number of NCs = 3 ===> average 0.8814 seconds over 7 runs\n",
"number of NCs = 6 ===> average 0.7203 seconds over 7 runs\n",
"number of NCs = 10 ===> average 0.8771 seconds over 7 runs\n",
"number of NCs = 15 ===> average 1.0266 seconds over 7 runs\n",
"number of NCs = 20 ===> average 1.0633 seconds over 7 runs\n",
"number of NCs = 30 ===> average 12.3063 seconds over 7 runs\n",
"number of NCs = 50 ===> average 11.7888 seconds over 7 runs\n",
"number of NCs = 70 ===> average 11.874 seconds over 7 runs\n",
"number of NCs = 90 ===> average 12.0155 seconds over 7 runs\n",
"number of NCs = 100 ===> average 10.8955 seconds over 7 runs\n"
]
}
],
"source": [
"in_times = time_processes(\n",
" variable='number of NCs',\n",
" values=NUMBER_OF_NCS,\n",
" processes={\n",
" 'IN query': lambda num_ncs: exec_sql(in_query(ALL_NCS[:num_ncs]))\n",
" }\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"chart_times(in_times, \"IN query execution times (one year period)\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### JOIN query"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"SELECT *\n",
"FROM\n",
" (SELECT requesttype,\n",
" nc,\n",
" createddate,\n",
" srnumber,\n",
" latitude,\n",
" longitude\n",
" FROM ingest_staging_table\n",
" WHERE createddate > '2019-01-01'\n",
" AND createddate < '2020-01-01' ) AS sub\n",
"INNER JOIN (\n",
" VALUES (4), (5), (6)) vals(v) ON (nc = v)\n"
]
}
],
"source": [
"def join_query(ncList):\n",
" return f\"\"\"\n",
" SELECT * \n",
" FROM (\n",
" SELECT {(', ').join(FIELDS)}\n",
" FROM {TABLE}\n",
" WHERE \n",
" createddate > '{START_DATE}' AND \n",
" createddate < '{END_DATE}'\n",
" ) as sub\n",
" INNER JOIN ( \n",
" VALUES {(', ').join(['({})'.format(str(nc)) for nc in ncList])} ) vals(v)\n",
" ON (nc = v)\n",
" \"\"\"\n",
"\n",
"# example with ncList = [4, 5, 6]\n",
"print_sql(join_query([4, 5, 6]))"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"JOIN query\n",
"number of NCs = 1 ===> average 0.5477 seconds over 7 runs\n",
"number of NCs = 3 ===> average 0.5949 seconds over 7 runs\n",
"number of NCs = 6 ===> average 1.3586 seconds over 7 runs\n",
"number of NCs = 10 ===> average 9.8942 seconds over 7 runs\n",
"number of NCs = 15 ===> average 10.0761 seconds over 7 runs\n",
"number of NCs = 20 ===> average 9.8363 seconds over 7 runs\n",
"number of NCs = 30 ===> average 10.036 seconds over 7 runs\n",
"number of NCs = 50 ===> average 8.9542 seconds over 7 runs\n",
"number of NCs = 70 ===> average 9.2785 seconds over 7 runs\n",
"number of NCs = 90 ===> average 10.2356 seconds over 7 runs\n",
"number of NCs = 100 ===> average 9.5956 seconds over 7 runs\n"
]
}
],
"source": [
"join_times = time_processes(\n",
" variable='number of NCs',\n",
" values=NUMBER_OF_NCS,\n",
" processes={\n",
" 'JOIN query': lambda num_ncs: exec_sql(join_query(ALL_NCS[:num_ncs]))\n",
" }\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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YIMNWHHFFZsORZKkSWNSJWMLFy5k9dVXZ8aMGUSMuzFGJ7TMZNGiRSxcuJCNNtqo6XAkSZo0JtVlygcffJC1117bRGwURARrr722rY6SJPXZpErGABOxUeRrK0lS/026ZKxp06dPB+Cvf/0rL33pS9lkk03YeOONOeKII2j99NTcuXN597vfDcCcOXNYddVVueWWW5ZZhiRJmvwmVZ+xTjMOPb2vy1tw9CuHNN0DDzzAq171Kr785S+z6667cv/99/O6172OE044gYMOOmiZ6ddZZx0++9nPcswxx/Q13qHITDKT5ZYzL5ckqQl+Ao+C73znO+ywww7suuuuAKy66qocf/zxHH300V2n32+//fj+97/P7bffPuByv/GNb7DJJpuw0047ccABBzzWujZ79mx++MMfPjZde8vasccey9Zbb83znvc8Dj/8cAAWLFjAs5/9bN71rnex1VZbccQRR3DIIYc8Ns9Xv/pV3v/+9w9v4yVJUi0mY6Pgr3/9Ky984QsfV/bMZz6Te++9l7vvvnuZ6adPn85+++3Hcccd13OZN954I4cffjjnnXceZ555JpdddtmgcZxxxhlcddVVXHDBBVxyySVceOGFnHvuuQD87W9/Y9999+Xiiy/mgx/8IKeddhqLFy8GStL3tre9rc4mS5KkYTIZGwWZ2bOze6/ygw8+mG9+85tdkzWA888/n1mzZrHuuuuy0kor8YY3vGHQOM444wzOOOMMXvCCF7DVVltxxRVXcNVVVwHw9Kc/ne222w6A1VZbjZe+9KX8/Oc/54orrmDx4sVsscUWQ9lUSZI0QpO6z1hTnvOc5zzWAtVyzTXXMH36dFZfffWu86y55pq86U1v4oQTTui53F6J3AorrMCjjz4KlETw4Ycffuz/j3zkI7zjHe943PQLFixgtdVWe1zZ/vvvz1FHHcVmm21mq5gkSWPIZGwUvPnNb+aoo47irLPOYpddduGBBx7g4IMP5kMf+tCA873//e9n6623ZsmSJcvUbbvttrz3ve9l0aJFPOEJT+AHP/gBW265JQAzZszgwgsvZO+99+bUU0997HLjbrvtxsc+9jHe/OY3M336dG644Yaeo+dvu+22XH/99Vx00UVceumlI3wFJEkTSb9veOtlqDfCTTVepuyjJUuWsPLKK7PKKqtw6qmncuSRR7LpppuyxRZbsPXWWz/W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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"chart_times(join_times, 'JOIN query execution times (one year of data)')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### IN vs. JOIN"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"in_vs_join = pd.concat([in_times, join_times], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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iKDo9twnM/u0Dp/UyG5KqU2UXUdvoxh79u3M/Ha9EalDmSifRzFG6jfAxzPzsVqD6oeR3k0ptZrJmCRJUo0cMyZJklSjYTtmbLnllsvx48fXHYYkSVKPbr311scyc1yzsmGbjI0fP54ZM2bUHYYkSVKPIuKBrsrsppQkSaqRyZgkSVKNTMYkSZJqNGzHjDUzd+5cZs2axfPPP193KG1p9OjRrLTSSiy66KJ1hyJJUttoq2Rs1qxZLLXUUowfP55ikWS1SmYyZ84cZs2axYQJE+oOR5KkttFW3ZTPP/88Y8eONREbABHB2LFjbXWUJKnF2ioZA0zEBpDXVpKk1mu7ZKxuY8aMAWDmzJlEBN/4xjfmlx122GFMnTq1psgkSdJQ1FZjxhqNP/rylu5v5invrVR/+eWX58wzz+QjH/kIiy22WEtj6Y158+axyCJt/SOWJGnYs2VsAI0bN46tttqK888/v9t6//jHP5g0aRIbb7wxxx133PzWtWnTprHDDjvMr9e5Ze3WW29l8803Z6ONNmLbbbfl4YcfBmDy5Mkcc8wxbL755nzhC19gwoQJzJ07F4CnnnqK8ePHz38vSZLqZzI2wI4++mhOP/10XnrppS7rfOITn+BjH/sYt9xyCyussEKP+5w7dy6HH344l1xyCbfeeisHHnggxx577PzyJ554gunTp3P88cczefJkLr+8aCG86KKL2G233VyaQpKkIcRkbIBNmDCBTTbZhAsvvLDLOtdffz177bUXAPvss0+P+7z77ru5/fbb2Xrrrdlggw04+eSTmTVr1vzyPffcc/7rgw46iPPOOw+A8847jwMOOKCvpyJJkgaAA4oGwTHHHMPuu+/OZptt1mWdZjMVF1lkEV5++eX57zuWlchM1llnHW688cam+1pyySXnv950002ZOXMm06dP56WXXmLdddft62lIkqQBYDI2CNZcc03WXnttLrvsMjbZZJMFyjfddFMuuugiPvShD3HBBRfM377qqqtyxx138MILL/D888/z29/+lne+852sscYazJ49mxtvvJFJkyYxd+5c7rnnHtZZZ52mx993333Za6+9OO644wbsHCUNrL5MSKo66UhSPeymHCTHHnvsq7oSOzvzzDP55je/ycYbb8yTTz45f/vKK6/MHnvswVve8hb23ntv3vrWtwKw2GKLcckll3DUUUex/vrrs8EGG3DDDTd0eey9996bxx9/fH5XqCRJGjoiM+uOoU8mTpyYM2bMeNW2O++8k7XWWqumiFpnzJgxPP300y3b3yWXXMKll17KD3/4w37vq12usTTc2DImDW8RcWtmTmxWZjdlmzv88MP5v//7P6644oq6Q5EkSU0MajIWEecCOwCPZua65bbTgPcBLwL3AQdk5hODGddQ08pWsc53AJAkSUPPYI8Zmwps17DtKmDdzHwLcA/w2UGOSZIkqTaDmoxl5rXAfxq2XZmZ88q3fwBWGsyYJEmS6jTUxowdCPy47iAkSRpJnCBSryGztEVEHAvMAy7ops4hETEjImbMnj178IKTJEkaIEMiGYuI/SgG9u+d3ay1kZnnZObEzJw4bty4wQuwgo6bfP/tb39jyy23ZPXVV2e11VbjpJNOouPUpk6dymGHHQbAlClTWGKJJXj00UcX2IckSWp/tXdTRsR2wFHA5pn5bEt3PmXplu6OKU/2XAd47rnn2HHHHfnWt77FNttsw7PPPstuu+3G2WefzaGHHrpA/eWWW47TTz+dU089tbXx9kJmkpkstNCQyMslSRpxBntpix8Bk4HlImIWcDzF7MlRwFXl/Rn/kJkfHcy4Wu3CCy9k0003ZZtttgFgiSWW4KyzzmLy5MlNk7EDDzyQqVOnctRRR/Ha1762y/2ed955fOlLX2LFFVdk9dVXZ9SoUZx11lnsv//+7LDDDuy+++7AqxeNPe2007j44ot54YUX2GWXXTjhhBOYOXMm22+/PVtssQU33ngjO++8M0888QRnnHEGAN/97ne58847+epXv9rqSyNJbcNxVmqVwZ5NuVdmrpiZi2bmSpn5/cx8c2aunJkblI9hnYhB0UW50UYbvWrbm970Jp5++mmeeuqpBeqPGTOGAw88kDPPPLPLfT788MMcf/zxXH/99Vx11VXccccdPcZx5ZVXcu+993LzzTdz2223ceutt3LttdcCcPfdd7Pvvvvypz/9if/5n//hl7/8JXPnzgWKpO+AAw6ocsqSJKmPau+mbEeZSdnKt4Cuth9xxBFssMEGfOYzn2laftNNNzF58mQ6xsrtueee3HPPPd3GceWVV3LllVfOv6fl008/zb333ssqq6zCqquuytvf/nYAllxySbbccksuu+wy1lprLebOnct6663Xq3OVpKqqtijZmqR2ZzI2ANZZ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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"chart_times(in_vs_join, 'IN vs. JOIN (one year period)')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Anti-Join query"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"SELECT *\n",
"FROM\n",
" (SELECT requesttype,\n",
" nc,\n",
" createddate,\n",
" srnumber,\n",
" latitude,\n",
" longitude\n",
" FROM ingest_staging_table\n",
" WHERE createddate > '2019-01-01'\n",
" AND createddate < '2020-01-01' ) AS sub\n",
"LEFT OUTER JOIN (\n",
" VALUES (4), (5), (6)) vals(v) ON (nc = v)\n",
"WHERE v IS NULL\n"
]
}
],
"source": [
"def anti_join_query(ncList):\n",
" return f\"\"\"\n",
" SELECT *\n",
" FROM (\n",
" SELECT {(', ').join(FIELDS)}\n",
" FROM {TABLE}\n",
" WHERE \n",
" createddate > '{START_DATE}' AND \n",
" createddate < '{END_DATE}'\n",
" ) as sub\n",
" LEFT OUTER JOIN \n",
" ( VALUES {(', ').join(['({})'.format(str(nc)) for nc in ncList])} ) vals(v)\n",
" ON (nc = v)\n",
" WHERE v IS NULL\n",
" \"\"\"\n",
"\n",
"# example with ncList = [4, 5, 6]\n",
"print_sql(anti_join_query([4, 5, 6]))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Anti-Join query\n",
"number of NCs = 1 ===> average 10.344 seconds over 7 runs\n",
"number of NCs = 3 ===> average 9.9989 seconds over 7 runs\n",
"number of NCs = 6 ===> average 10.2521 seconds over 7 runs\n",
"number of NCs = 10 ===> average 10.0673 seconds over 7 runs\n",
"number of NCs = 15 ===> average 9.0483 seconds over 7 runs\n",
"number of NCs = 20 ===> average 9.1414 seconds over 7 runs\n",
"number of NCs = 30 ===> average 8.9979 seconds over 7 runs\n",
"number of NCs = 50 ===> average 8.7927 seconds over 7 runs\n",
"number of NCs = 70 ===> average 10.1924 seconds over 7 runs\n",
"number of NCs = 90 ===> average 10.4313 seconds over 7 runs\n",
"number of NCs = 100 ===> average 10.2128 seconds over 7 runs\n"
]
}
],
"source": [
"anti_join_times = time_processes(\n",
" variable='number of NCs',\n",
" values=NUMBER_OF_NCS,\n",
" processes={\n",
" 'Anti-Join query': lambda num_ncs: exec_sql(anti_join_query(ALL_NCS[:num_ncs]))\n",
" }\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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/jLnn38+11xzDVOnTuWb3/zm4vpx48Zx8cUXc9hhh7Hqqqty3XXXATBz5kymTZvW9jpKqpfJmKQR6bTTTmO//fYDYL/99uO0005bXLflllsyceJElllmGTbbbDPmzp3b5+VcfPHF7L333qy00kqsvPLK7LPPPvzlL39ZarrelvnII4/w8MMPs9122wHw7ne/u9dlX3755dx44428/vWvZ7PNNuMnP/kJd9655PJ273znOxc/Puigg5g5cyaLFi3i5z//Of/1X//VxzWWNNTsMyZpxFmwYAEXXHABN9xwAxHBokWLiAi+9rWvAbD88ssvnnbMmDEsXLiwx/kdf/zxnHjiiUDRj2zttddeXNfqcGMrvS0zM7s9o3Hs2LE899xzi593DUGRmey0007PSzQbrbTSSosf77vvvhxxxBHsuOOObLHFFowfP76tuCXVz2RM0ohzxhlncOCBB/LDH/5wcdl2223HxRdf3OPrVlllFf7zn/+w5pprPq98+vTpTJ8+veVrtt12W6ZNm8ahhx5KZnLmmWfys5/9rHLMq622GquuuioXX3wx22yzDaeccsriukmTJnHCCSfw3HPPcc8993DllVcCsNVWWzF9+nRuu+021l9/fZ544gnmzZvHBhtssNT8x40bxy677ML//M//cNJJJ1WOT51toE/C6U67J+d0Gg9TShpxTjvtNPbee+/nle27776ceuqpPb7u4IMP5s1vfvPiDvw9WbhwIcsvvzxTpkxh2rRpbLnllrz2ta/loIMOYvPNN+9T3DNnzmT69OlsvfXWrLDCCovLX//61zN58mRe9apX8alPfWpxZ/wJEyYwa9Ys9t9/f1796lez1VZb9TiMxwEHHEBEsPPOO/cpPkn1iHab4IebqVOn5pw5c+oOQ+pIN910ExtttFHdYQya+fPns9lmm3HPPfcM2jLmzp3L7rvvzg033DBg8zz22GN55JFHOOqoo1rWj/btpr6zZWzwRcTVmTm1VV1HHaYcig9bJ3/QpNHg7LPP5jOf+Qxf/epX6w6lkr333pvbb7+dCy64oO5QJFXUUcmYJPVmjz32YI899hj05UyaNGlAW8XOPPPMAZuXpKFlMqZa2VopSep0duCX1Ccjtb9pp3J7ScOXLWOSKhs3bhwLFixg/Pjx3Y6dpeEjM1mwYAHjxo2rO5RRxU7vw9NIPOJiMiapsokT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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"chart_times(anti_join_times, \"Anti-Join execution times (one year period)\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### NOT IN query"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"SELECT requesttype,\n",
" nc,\n",
" createddate,\n",
" srnumber,\n",
" latitude,\n",
" longitude\n",
"FROM ingest_staging_table\n",
"WHERE createddate > '2019-01-01'\n",
" AND createddate < '2020-01-01'\n",
" AND nc NOT IN (4,\n",
" 5,\n",
" 6)\n"
]
}
],
"source": [
"def not_in_query(ncList):\n",
" return f\"\"\"\n",
" SELECT {(', ').join(FIELDS)}\n",
" FROM {TABLE}\n",
" WHERE \n",
" createddate > '{START_DATE}' AND \n",
" createddate < '{END_DATE}' AND \n",
" nc NOT IN ({(', ').join([str(nc) for nc in ncList])})\n",
" \"\"\"\n",
"\n",
"# example with ncList = [4, 5, 6]\n",
"print_sql(not_in_query([4, 5, 6]))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"NOT IN query\n",
"number of NCs = 1 ===> average 10.4433 seconds over 7 runs\n",
"number of NCs = 3 ===> average 10.1845 seconds over 7 runs\n",
"number of NCs = 6 ===> average 9.8309 seconds over 7 runs\n",
"number of NCs = 10 ===> average 10.2907 seconds over 7 runs\n",
"number of NCs = 15 ===> average 10.372 seconds over 7 runs\n",
"number of NCs = 20 ===> average 10.6519 seconds over 7 runs\n",
"number of NCs = 30 ===> average 10.2284 seconds over 7 runs\n",
"number of NCs = 50 ===> average 10.0715 seconds over 7 runs\n",
"number of NCs = 70 ===> average 10.2147 seconds over 7 runs\n",
"number of NCs = 90 ===> average 9.7998 seconds over 7 runs\n"
]
}
],
"source": [
"not_in_times = time_processes(\n",
" variable='number of NCs',\n",
" values=NUMBER_OF_NCS,\n",
" processes={\n",
" 'NOT IN query': lambda num_ncs: exec_sql(not_in_query(ALL_NCS[:num_ncs]))\n",
" }\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"chart_times(not_in_times, \"NOT IN query execution times (one year period)\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pickle\n",
"\n",
"all_times = pd.concat([in_times, join_times, anti_join_times, not_in_times], axis=1)\n",
"with open('IN_alternatives.pkl', 'wb') as f:\n",
" pickle.dump(all_times, f)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment