Repository: great-expectations/great_expectations

Issue:
Sampling of data batches configuration is ignored for Athena tables
**Describe the bug**
Sampling configurations for Athena tables are ignored or don't help improve the performance when generating a validator.

**To Reproduce**
1. Use the following YAML config (Replace `test_table_name` and `test_schema_name` with valid names)
**IMPORTANT**: Please use a large table to see the difference.
```
config_version: 3.0

datasources:
  my_athena:
    data_connectors:
      default_configured_data_connector_name:
        class_name: ConfiguredAssetSqlDataConnector
        assets:
          test_table_name:
            class_name: Asset
            module_name: great_expectations.datasource.data_connector.asset
            include_schema_name: True
            schema_name: test_schema_name
            tables:
              test_table_name:
                partitioners:
                  whole_table:
                  include_schema_name: True
                  schema_name: test_schema_name
                  splitter_method: _split_on_column_value
                  splitter_kwargs:
                    column_name: test_column_name
                    sampling_method: _sample_using_random
                    sampling_kwargs:
                      p: 1.0e-1
        module_name: great_expectations.datasource.data_connector
    execution_engine:
      connection_string: awsathena+rest://:@athena.us-east-1.amazonaws.com:445?work_group=primary
      class_name: SqlAlchemyExecutionEngine
      module_name: great_expectations.execution_engine
    class_name: Datasource
    module_name: great_expectations.datasource

config_variables_file_path: config_variables.yml

plugins_directory: plugins/

stores:
  expectations_store:
    class_name: ExpectationsStore
    store_backend:
      class_name: TupleFilesystemStoreBackend
      base_directory: expectations/

  validations_store:
    class_name: ValidationsStore
    store_backend:
      class_name: TupleFilesystemStoreBackend
      base_directory: uncommitted/validations/

  evaluation_parameter_store:
    class_name: EvaluationParameterStore

  checkpoint_store:
    class_name: CheckpointStore
    store_backend:
      class_name: TupleFilesystemStoreBackend
      suppress_store_backend_id: true
      base_directory: checkpoints/

expectations_store_name: expectations_store
validations_store_name: validations_store
evaluation_parameter_store_name: evaluation_parameter_store
checkpoint_store_name: checkpoint_store

```
2. Execute the following command on CLI
```
great_expectations suite new
```
3. Select option 2
How would you like to create your Expectation Suite?
    1. Manually, without interacting with a sample batch of data (default)
    2. Interactively, with a sample batch of data
    3. Automatically, using a profiler
4. Select option 1 (Expect to see the real table name instead of the placeholder)
Which data asset (accessible by data connector "default_configured_data_connector_name") would you like to use?
    1. test_table_name

5. Open the Jupyter Notebook
6. Run the first autogenerated code section
7. Observe the amount of time it takes to get the validator. You may get a time-out. Or alternatively go into Athena console to inspect the recent query
8. Expect to see the full table being scanned

**Expected behavior**
When using the `ConfiguredAssetSqlDataConnector` with sampling configs per this [How to configure a DataConnector for splitting and sampling tables in SQL tutorial](https://docs.greatexpectations.io/docs/guides/connecting_to_your_data/advanced/how_to_configure_a_dataconnector_for_splitting_and_sampling_tables_in_sql/), `get_validator()` is supposed to only scan part of the identified table instead of scanning the entire table.

**Environment:**
 - Operating System: MacOS
 - Great Expectations Version: 0.14.1

**Additional context**
The `get_validator()` method by default scans the entire table using the below query constructed by [this _build_selectable_from_batch_spec method](https://github.com/great-expectations/great_expectations/blob/develop/great_expectations/execution_engine/sqlalchemy_execution_engine.py#L1060-L1066).
```
SELECT * FROM <schema_name>.<table_name> WHERE True
```
Another way to test it is to comment out the `table` attribute in YAML and rerun the steps. Expect the same amount of time needed to get the validator. This means the sampling config that we passed in earlier is not preventing Athena to query the entire table.
```
...
datasources:
  my_athena:
    data_connectors:
      default_configured_data_connector_name:
        class_name: ConfiguredAssetSqlDataConnector
        assets:
          test_table_name:
            class_name: Asset
            module_name: great_expectations.datasource.data_connector.asset
            include_schema_name: True
            schema_name: test_schema_name
            # tables:
            #   test_table_name:
            #     partitioners:
            #       whole_table:
            #       include_schema_name: True
            #       schema_name: test_schema_name
            #       splitter_method: _split_on_column_value
            #       splitter_kwargs:
            #         column_name: test_column_name
            #         sampling_method: _sample_using_random
            #         sampling_kwargs:
            #           p: 1.0e-1
...
```


Discussion:
Howdy @houqi2018, thanks for reaching out. Can you compare the number of rows returned in each batch; where you are and where you are not using the splitter.
Hi @AFineDayFor, I've run the notebook using different data assets (different schema names and table names). I noticed when I used a small table, the `getValidator()` method was executed quickly and the numbers of rows scanned were the same, i.e., the entire table. However, when I tried the same with a large table, the method timed out and I couldn't compare the results. Let me know if this is what you were looking for and if you need any additional context. Thanks!
Hi @houqi2018 thank you for bringing this up. You are using a `ConfiguredAssetSqlDataConnector`, which currently does not support sampling and splitting, so the lack of speed gain may be from the splitting and sampling directive not being recognized / executed. This a known bug that we are working on resolving. 

The [documentation on splitting and sampling](https://docs.greatexpectations.io/docs/guides/connecting_to_your_data/advanced/how_to_configure_a_dataconnector_for_splitting_and_sampling_tables_in_sql) uses an `SimpleSqlalchemyDatasource` in the example, and I was able to confirm that the following configuration works on our end: 

```yaml

datasources:
  my_simple_athena:
    class_name: SimpleSqlalchemyDatasource
    connection_string: **your_connection_string**
    tables:
      **your_table**:
        partitioners:
          by_num_riders_random_sample:
            include_schema_name: True
            schema_name: **your_schema_name**
            splitter_method: _split_on_column_value
            splitter_kwargs:
              column_name: **your_column_name**
            sampling_method: _sample_using_random
            sampling_kwargs:
              p: 1.0e-1
```
 
Would you be able to test it on your table and see if the `_split_on_column_value` gives the expected result? 

Resolving patch:
diff --git a/great_expectations/datasource/data_connector/configured_asset_sql_data_connector.py b/great_expectations/datasource/data_connector/configured_asset_sql_data_connector.py
--- a/great_expectations/datasource/data_connector/configured_asset_sql_data_connector.py
+++ b/great_expectations/datasource/data_connector/configured_asset_sql_data_connector.py
@@ -1,6 +1,7 @@
 from copy import deepcopy
 from typing import Dict, List, Optional, cast
 
+import great_expectations.exceptions as ge_exceptions
 from great_expectations.core.batch import (
     BatchDefinition,
     BatchRequest,
@@ -43,9 +44,10 @@ def __init__(
         assets: Optional[Dict[str, dict]] = None,
         batch_spec_passthrough: Optional[dict] = None,
     ):
-        if assets is None:
-            assets = {}
-        self._assets = assets
+        self._assets: dict = {}
+        if assets:
+            for asset_name, config in assets.items():
+                self.add_data_asset(asset_name, config)
 
         super().__init__(
             name=name,
@@ -64,10 +66,37 @@ def add_data_asset(
         config: dict,
     ):
         """
-        Add data_asset to DataConnector using data_asset name as key, and data_asset configuration as value.
+        Add data_asset to DataConnector using data_asset name as key, and data_asset config as value.
         """
+        name = self._update_data_asset_name_from_config(name, config)
         self._assets[name] = config
 
+    def _update_data_asset_name_from_config(
+        self, data_asset_name: str, data_asset_config: dict
+    ) -> str:
+
+        data_asset_name_prefix: str = data_asset_config.get(
+            "data_asset_name_prefix", ""
+        )
+        data_asset_name_suffix: str = data_asset_config.get(
+            "data_asset_name_suffix", ""
+        )
+        schema_name: str = data_asset_config.get("schema_name", "")
+        include_schema_name: bool = data_asset_config.get("include_schema_name", True)
+        if schema_name and include_schema_name is False:
+            raise ge_exceptions.DataConnectorError(
+                message=f"{self.__class__.__name__} ran into an error while initializing Asset names. Schema {schema_name} was specified, but 'include_schema_name' flag was set to False."
+            )
+
+        if schema_name:
+            data_asset_name: str = f"{schema_name}.{data_asset_name}"
+
+        data_asset_name: str = (
+            f"{data_asset_name_prefix}{data_asset_name}{data_asset_name_suffix}"
+        )
+
+        return data_asset_name
+
     def _get_batch_identifiers_list_from_data_asset_config(
         self,
         data_asset_name,
@@ -245,13 +274,34 @@ def _generate_batch_spec_parameters_from_batch_definition(
             dict built from batch_definition
         """
         data_asset_name: str = batch_definition.data_asset_name
+        table_name: str = self._get_table_name_from_batch_definition(batch_definition)
         return {
             "data_asset_name": data_asset_name,
-            "table_name": data_asset_name,
+            "table_name": table_name,
             "batch_identifiers": batch_definition.batch_identifiers,
             **self.assets[data_asset_name],
         }
 
+    def _get_table_name_from_batch_definition(
+        self, batch_definition: BatchDefinition
+    ) -> str:
+        """
+            Helper method called by _get_batch_identifiers_list_from_data_asset_config() to parse table_name from data_asset_name in cases
+            where schema is included.
+
+            data_asset_name in those cases are [schema].[table_name].
+
+        function will split data_asset_name on [schema]. and return the resulting table_name.
+        """
+        table_name: str = batch_definition.data_asset_name
+        data_asset_dict: dict = self.assets[batch_definition.data_asset_name]
+        if "schema_name" in data_asset_dict:
+            schema_name_str: str = data_asset_dict["schema_name"]
+            if schema_name_str in table_name:
+                table_name = table_name.split(schema_name_str + ".")[1]
+
+        return table_name
+
     # Splitter methods for listing partitions
 
     def _split_on_whole_table(
@@ -263,7 +313,6 @@ def _split_on_whole_table(
 
         Note: the table_name parameter is a required to keep the signature of this method consistent with other methods.
         """
-
         return sa.select([sa.true()])
 
     def _split_on_column_value(
diff --git a/great_expectations/datasource/simple_sqlalchemy_datasource.py b/great_expectations/datasource/simple_sqlalchemy_datasource.py
--- a/great_expectations/datasource/simple_sqlalchemy_datasource.py
+++ b/great_expectations/datasource/simple_sqlalchemy_datasource.py
@@ -1,6 +1,9 @@
 import copy
 import logging
 
+from great_expectations.datasource.data_connector.configured_asset_sql_data_connector import (
+    ConfiguredAssetSqlDataConnector,
+)
 from great_expectations.datasource.new_datasource import BaseDatasource
 
 logger = logging.getLogger(__name__)
@@ -57,7 +60,7 @@ def _init_data_connectors(
 
         # First, build DataConnectors for introspected assets
         for name, config in introspection_configs.items():
-            data_connector_config = dict(
+            data_connector_config: dict = dict(
                 **{
                     "class_name": "InferredAssetSqlDataConnector",
                     "name": name,
@@ -75,9 +78,9 @@ def _init_data_connectors(
                 "partitioners"
             ].items():
 
-                data_connector_name = partitioner_name
+                data_connector_name: str = partitioner_name
                 if data_connector_name not in self.data_connectors:
-                    data_connector_config = {
+                    data_connector_config: dict = {
                         "class_name": "ConfiguredAssetSqlDataConnector",
                         "assets": {},
                     }
@@ -85,21 +88,16 @@ def _init_data_connectors(
                         data_connector_name, data_connector_config
                     )
 
-                data_connector = self.data_connectors[data_connector_name]
+                data_connector: ConfiguredAssetSqlDataConnector = self.data_connectors[
+                    data_connector_name
+                ]
 
-                data_asset_config = copy.deepcopy(partitioner_config)
+                data_asset_config: dict = copy.deepcopy(partitioner_config)
                 data_asset_config["table_name"] = table_name
+                data_asset_name: str = table_name
 
-                data_asset_name_prefix = data_asset_config.pop(
-                    "data_asset_name_prefix", ""
-                )
-                data_asset_name_suffix = data_asset_config.pop(
-                    "data_asset_name_suffix", ""
-                )
-                data_asset_name = (
-                    data_asset_name_prefix + table_name + data_asset_name_suffix
-                )
-
+                # If config contains any prefix, suffix or schema_name values,
+                # they will be handled at the ConfiguredAssetSqlDataConnector-level
                 data_connector.add_data_asset(
                     data_asset_name,
                     data_asset_config,


Test patch:
diff --git a/tests/datasource/data_connector/test_sql_data_connector.py b/tests/datasource/data_connector/test_sql_data_connector.py
--- a/tests/datasource/data_connector/test_sql_data_connector.py
+++ b/tests/datasource/data_connector/test_sql_data_connector.py
@@ -13,9 +13,10 @@
     sqlalchemy = pytest.importorskip("sqlalchemy")
 except ImportError:
     sqlalchemy = None
+import great_expectations.exceptions as ge_exceptions
 from great_expectations.validator.validator import Validator
 
-yaml = YAML()
+yaml = YAML(typ="safe")
 
 
 # TODO: <Alex>ALEX -- Some methods in this module are misplaced and/or provide no action; this must be repaired.</Alex>
@@ -1103,6 +1104,92 @@ def test_more_complex_instantiation_of_ConfiguredAssetSqlDataConnector(
     }
 
 
+def test_more_complex_instantiation_of_ConfiguredAssetSqlDataConnector_include_schema_name(
+    test_cases_for_sql_data_connector_sqlite_execution_engine,
+):
+    my_data_connector: ConfiguredAssetSqlDataConnector = ConfiguredAssetSqlDataConnector(
+        name="my_sql_data_connector",
+        datasource_name="my_test_datasource",
+        execution_engine="test_cases_for_sql_data_connector_sqlite_execution_engine",
+        assets={
+            "table_partitioned_by_date_column__A": {
+                "splitter_method": "_split_on_column_value",
+                "splitter_kwargs": {"column_name": "date"},
+                "include_schema_name": True,
+                "schema_name": "main",
+            },
+        },
+    )
+    assert "main.table_partitioned_by_date_column__A" in my_data_connector.assets
+
+    # schema_name given but include_schema_name is set to False
+    with pytest.raises(ge_exceptions.DataConnectorError) as e:
+        ConfiguredAssetSqlDataConnector(
+            name="my_sql_data_connector",
+            datasource_name="my_test_datasource",
+            execution_engine="test_cases_for_sql_data_connector_sqlite_execution_engine",
+            assets={
+                "table_partitioned_by_date_column__A": {
+                    "splitter_method": "_split_on_column_value",
+                    "splitter_kwargs": {"column_name": "date"},
+                    "include_schema_name": False,
+                    "schema_name": "main",
+                },
+            },
+        )
+
+    assert (
+        e.value.message
+        == "ConfiguredAssetSqlDataConnector ran into an error while initializing Asset names. Schema main was specified, but 'include_schema_name' flag was set to False."
+    )
+
+
+def test_more_complex_instantiation_of_ConfiguredAssetSqlDataConnector_include_schema_name_prefix_suffix(
+    test_cases_for_sql_data_connector_sqlite_execution_engine,
+):
+    my_data_connector: ConfiguredAssetSqlDataConnector = ConfiguredAssetSqlDataConnector(
+        name="my_sql_data_connector",
+        datasource_name="my_test_datasource",
+        execution_engine="test_cases_for_sql_data_connector_sqlite_execution_engine",
+        assets={
+            "table_partitioned_by_date_column__A": {
+                "splitter_method": "_split_on_column_value",
+                "splitter_kwargs": {"column_name": "date"},
+                "include_schema_name": True,
+                "schema_name": "main",
+                "data_asset_name_prefix": "taxi__",
+                "data_asset_name_suffix": "__asset",
+            },
+        },
+    )
+    assert (
+        "taxi__main.table_partitioned_by_date_column__A__asset"
+        in my_data_connector.assets
+    )
+
+    # schema_name provided, but include_schema_name is set to False
+    with pytest.raises(ge_exceptions.DataConnectorError) as e:
+        ConfiguredAssetSqlDataConnector(
+            name="my_sql_data_connector",
+            datasource_name="my_test_datasource",
+            execution_engine="test_cases_for_sql_data_connector_sqlite_execution_engine",
+            assets={
+                "table_partitioned_by_date_column__A": {
+                    "splitter_method": "_split_on_column_value",
+                    "splitter_kwargs": {"column_name": "date"},
+                    "include_schema_name": False,
+                    "schema_name": "main",
+                    "data_asset_name_prefix": "taxi__",
+                    "data_asset_name_suffix": "__asset",
+                },
+            },
+        )
+    assert (
+        e.value.message
+        == "ConfiguredAssetSqlDataConnector ran into an error while initializing Asset names. Schema main was specified, but 'include_schema_name' flag was set to False."
+    )
+
+
 # TODO
 def test_ConfiguredAssetSqlDataConnector_with_sorting(
     test_cases_for_sql_data_connector_sqlite_execution_engine,
diff --git a/tests/datasource/test_new_datasource_with_sql_data_connector.py b/tests/datasource/test_new_datasource_with_sql_data_connector.py
--- a/tests/datasource/test_new_datasource_with_sql_data_connector.py
+++ b/tests/datasource/test_new_datasource_with_sql_data_connector.py
@@ -1050,7 +1050,7 @@ def test_batch_request_sql_with_schema(
     batch_request = {
         "datasource_name": "test_sqlite_db_datasource",
         "data_connector_name": "my_configured_data_connector",
-        "data_asset_name": "my_second_data_asset",
+        "data_asset_name": "main.my_second_data_asset",
     }
     validator = context.get_validator(
         batch_request=BatchRequest(**batch_request),
@@ -1080,7 +1080,7 @@ def test_batch_request_sql_with_schema(
     batch_request = {
         "datasource_name": "test_sqlite_db_datasource",
         "data_connector_name": "my_configured_data_connector",
-        "data_asset_name": "table_2",
+        "data_asset_name": "main.table_2",
     }
     validator = context.get_validator(
         batch_request=BatchRequest(**batch_request),
diff --git a/tests/integration/docusaurus/connecting_to_your_data/how_to_introspect_and_partition_your_data/sql_database/yaml_example_complete.py b/tests/integration/docusaurus/connecting_to_your_data/how_to_introspect_and_partition_your_data/sql_database/yaml_example_complete.py
--- a/tests/integration/docusaurus/connecting_to_your_data/how_to_introspect_and_partition_your_data/sql_database/yaml_example_complete.py
+++ b/tests/integration/docusaurus/connecting_to_your_data/how_to_introspect_and_partition_your_data/sql_database/yaml_example_complete.py
@@ -13,6 +13,7 @@
 
 introspection:  # Each key in the "introspection" section is an InferredAssetSqlDataConnector
     whole_table:
+        include_schema_name: true
         introspection_directives:
             include_views: true
         skip_inapplicable_tables: true  # skip and continue upon encountering introspection errors
@@ -23,6 +24,7 @@
         introspection_directives:
             include_views: true
         skip_inapplicable_tables: true  # skip and continue upon encountering introspection errors
+        include_schema_name: true
         included_tables:  # only include tables in this list when inferring data asset_names
             - main.yellow_tripdata_sample_2019_01  # format: schema_name.table_name
         splitter_method: _split_on_converted_datetime
@@ -34,6 +36,7 @@
         introspection_directives:
             include_views: true
         skip_inapplicable_tables: true
+        include_schema_name: true
         included_tables:  # only include tables in this list when inferring data asset_names
             - main.yellow_tripdata_sample_2019_01  # format: schema_name.table_name
         splitter_method: _split_on_converted_datetime
@@ -42,16 +45,18 @@
             date_format_string: "%Y-%m-%d %H"
 
 tables:  # Each key in the "tables" section is a table_name (key name "tables" in "SimpleSqlalchemyDatasource" configuration is reserved).
-    # data_asset_name is: concatenate(data_asset_name_prefix, table_name, data_asset_name_suffix)
+    # data_asset_name is: concatenate(data_asset_name_prefix, schema_name, table_name, data_asset_name_suffix)
     yellow_tripdata_sample_2019_01:  # Must match table name exactly.
         partitioners:  # Each key in the "partitioners" sub-section the name of a ConfiguredAssetSqlDataConnector (key name "partitioners" in "SimpleSqlalchemyDatasource" configuration is reserved).
             whole_table:
-                include_schema_name: True
+                include_schema_name: true
+                schema_name: main
                 data_asset_name_prefix: taxi__
                 data_asset_name_suffix: __asset
 
             by_num_riders:
-                include_schema_name: True
+                include_schema_name: true
+                schema_name: main
                 data_asset_name_prefix: taxi__
                 data_asset_name_suffix: __asset
                 splitter_method: _split_on_column_value
@@ -59,7 +64,8 @@
                     column_name: passenger_count
 
             by_num_riders_random_sample:
-                include_schema_name: True
+                include_schema_name: true
+                schema_name: main
                 data_asset_name_prefix: taxi__
                 data_asset_name_suffix: __asset
                 splitter_method: _split_on_column_value
@@ -84,7 +90,6 @@
     "taxi_datasource"
 ].get_available_data_asset_names(data_connector_names="whole_table")["whole_table"]
 assert len(available_data_asset_names) == 2
-
 # Here is a BatchRequest referring to an un-partitioned inferred data_asset.
 batch_request = BatchRequest(
     datasource_name="taxi_datasource",
@@ -94,7 +99,7 @@
 
 # Please note this override is only to provide good UX for docs and tests.
 # In normal usage you'd set your data asset name directly in the BatchRequest above.
-batch_request.data_asset_name = "yellow_tripdata_sample_2019_01"
+batch_request.data_asset_name: str = "main.yellow_tripdata_sample_2019_01"
 
 context.create_expectation_suite(
     expectation_suite_name="test_suite", overwrite_existing=True
@@ -122,7 +127,7 @@
 
 # Please note this override is only to provide good UX for docs and tests.
 # In normal usage you'd set your data asset name directly in the BatchRequest above.
-batch_request.data_asset_name = "yellow_tripdata_sample_2019_01"
+batch_request.data_asset_name: str = "main.yellow_tripdata_sample_2019_01"
 
 batch_list = context.get_batch_list(batch_request=batch_request)
 assert len(batch_list) == 31  # number of days in January
@@ -137,8 +142,7 @@
 
 # Please note this override is only to provide good UX for docs and tests.
 # In normal usage you'd set your data asset name directly in the BatchRequest above.
-batch_request.data_asset_name = "yellow_tripdata_sample_2019_01"
-
+batch_request.data_asset_name: str = "main.yellow_tripdata_sample_2019_01"
 batch_list = context.get_batch_list(batch_request=batch_request)
 assert 24 <= len(batch_list) <= 744  # number of hours in a 31-day month
 
@@ -152,7 +156,7 @@
 
 # Please note this override is only to provide good UX for docs and tests.
 # In normal usage you'd set your data asset name and other arguments directly in the BatchRequest above.
-batch_request.data_asset_name = "taxi__yellow_tripdata_sample_2019_01__asset"
+batch_request.data_asset_name: str = "taxi__main.yellow_tripdata_sample_2019_01__asset"
 
 batch_list = context.get_batch_list(batch_request=batch_request)
 assert len(batch_list) == 6
@@ -169,7 +173,7 @@
 
 # Please note this override is only to provide good UX for docs and tests.
 # In normal usage you'd set your data asset name and other arguments directly in the BatchRequest above.
-batch_request.data_asset_name = "taxi__yellow_tripdata_sample_2019_01__asset"
+batch_request.data_asset_name: str = "taxi__main.yellow_tripdata_sample_2019_01__asset"
 
 batch_list = context.get_batch_list(batch_request=batch_request)
 assert len(batch_list) == 6  # ride occupancy ranges from 1 passenger to 6 passengers
@@ -183,10 +187,10 @@
 # NOTE: The following code is only for testing and can be ignored by users.
 assert isinstance(validator, ge.validator.validator.Validator)
 assert "taxi_datasource" in [ds["name"] for ds in context.list_datasources()]
-assert "yellow_tripdata_sample_2019_01" in set(
+assert "main.yellow_tripdata_sample_2019_01" in set(
     context.get_available_data_asset_names()["taxi_datasource"]["whole_table"]
 )
-assert "taxi__yellow_tripdata_sample_2019_01__asset" in set(
+assert "taxi__main.yellow_tripdata_sample_2019_01__asset" in set(
     context.get_available_data_asset_names()["taxi_datasource"][
         "by_num_riders_random_sample"
     ]
diff --git a/tests/integration/docusaurus/connecting_to_your_data/how_to_introspect_and_partition_your_data/sql_database/yaml_example_gradual.py b/tests/integration/docusaurus/connecting_to_your_data/how_to_introspect_and_partition_your_data/sql_database/yaml_example_gradual.py
--- a/tests/integration/docusaurus/connecting_to_your_data/how_to_introspect_and_partition_your_data/sql_database/yaml_example_gradual.py
+++ b/tests/integration/docusaurus/connecting_to_your_data/how_to_introspect_and_partition_your_data/sql_database/yaml_example_gradual.py
@@ -42,6 +42,7 @@
 
 introspection:  # Each key in the "introspection" section is the name of an InferredAssetSqlDataConnector (key name "introspection" in "SimpleSqlalchemyDatasource" configuration is reserved).
     whole_table:
+        include_schema_name: true
         introspection_directives:
             include_views: true
         skip_inapplicable_tables: true  # skip and continue upon encountering introspection errors
@@ -83,7 +84,8 @@
     yellow_tripdata_sample_2019_01:  # Must match table name exactly.
         partitioners:  # Each key in the "partitioners" sub-section the name of a ConfiguredAssetSqlDataConnector (key name "partitioners" in "SimpleSqlalchemyDatasource" configuration is reserved).
             whole_table:
-                include_schema_name: True
+                include_schema_name: true
+                schema_name: main
                 data_asset_name_prefix: taxi__
                 data_asset_name_suffix: __asset
 """
diff --git a/tests/integration/test_script_runner.py b/tests/integration/test_script_runner.py
--- a/tests/integration/test_script_runner.py
+++ b/tests/integration/test_script_runner.py
@@ -279,7 +279,7 @@ class IntegrationTestFixture:
         extra_backend_dependencies=BackendDependencies.SQLALCHEMY,
     ),
     IntegrationTestFixture(
-        name="introspect_and_partition_yaml_example_gradual",
+        name="introspect_and_partition_yaml_example_gradual_sql",
         user_flow_script="tests/integration/docusaurus/connecting_to_your_data/how_to_introspect_and_partition_your_data/sql_database/yaml_example_gradual.py",
         data_context_dir="tests/integration/fixtures/no_datasources/great_expectations",
         data_dir="tests/test_sets/taxi_yellow_tripdata_samples/sqlite/",
@@ -287,7 +287,7 @@ class IntegrationTestFixture:
         extra_backend_dependencies=BackendDependencies.SQLALCHEMY,
     ),
     IntegrationTestFixture(
-        name="introspect_and_partition_yaml_example_complete",
+        name="introspect_and_partition_yaml_example_complete_sql",
         user_flow_script="tests/integration/docusaurus/connecting_to_your_data/how_to_introspect_and_partition_your_data/sql_database/yaml_example_complete.py",
         data_context_dir="tests/integration/fixtures/no_datasources/great_expectations",
         data_dir="tests/test_sets/taxi_yellow_tripdata_samples/sqlite/",
@@ -624,7 +624,6 @@ class IntegrationTestFixture:
 docs_test_matrix += cloud_azure_tests
 docs_test_matrix += cloud_s3_tests
 docs_test_matrix += cloud_redshift_tests
-docs_test_matrix += dockerized_db_tests
 
 pandas_integration_tests = [
     IntegrationTestFixture(