Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询性能缓慢“如CNTR%0405021%_Sql_Azure_Query Optimization - Fatal编程技术网

SQL查询性能缓慢“如CNTR%0405021%

SQL查询性能缓慢“如CNTR%0405021%,sql,azure,query-optimization,Sql,Azure,Query Optimization,我们有一个每天都在增长的数据库。到今天为止,大约有4000万条记录 此表/数据库位于Azure中 该表有一个主键“ClassifierID”,查询正在该主键上运行 主键的格式为ID+时间戳mmddyyy HHMMSS,例如“CNTR002220200 04052021 073000” 以下是按日期获取所有ID的查询 **Select distinct ScanID From ClassifierResults Where ClassifierID LIKE 'CNTR%04052020%*

我们有一个每天都在增长的数据库。到今天为止,大约有4000万条记录

此表/数据库位于Azure中

该表有一个主键“ClassifierID”,查询正在该主键上运行

主键的格式为ID+时间戳mmddyyy HHMMSS,例如“CNTR002220200 04052021 073000”

以下是按日期获取所有ID的查询

 **Select distinct ScanID
 From ClassifierResults
 Where ClassifierID LIKE 'CNTR%04052020%**

非常简单明了,但有时需要一分钟才能完成。您对我们如何优化查询有何建议?非常感谢。

这里最好的办法是修复您的设计,这样a您就不会将ID和时间戳存储在同一文本字段中,b您将时间戳存储在正确的日期/时间戳列中。使用您的单点数据,我建议采用以下表格设计:

ID           | timestamp
CNTR00220200 | timestamp '2021-04-05 07:30:00'
然后,在ID、时间戳上创建索引,并使用以下查询:

挑选* 从你的桌子上 我想要“CNTR%”和 时间戳>='2021-04-05'和时间戳<'2021-04-06';
上述查询搜索ID以CNTR开头且正好在2021-04-05日期的记录。您的SQL数据库应该能够使用我在上述查询中建议的复合索引。

这是主键的一个不好的候选项-键应该尽可能窄,并且是原子的-即-不是多个不同的属性组合在一起。性能差很可能是因为每个值都以“CNTR”开头,而您也这样做“CNTR%”,选择性为零,因此必须执行扫描-每行都像CNTR?同意。主键设计不正确。没有预料到数据会增长到这种规模。同意。这张桌子应该设计得更好。在我们添加另一列之前,是否有优化查询的空间?可能不是基于你所说的,对吧?比如“CNTR%0405020%”是一个真正的性能杀手,因为它不能立即被索引。如果可能的话,我建议改变你的设计,因为你的问题只会随着桌子的不断增长而变得更糟。也许其他人给了你一个临时的解决办法。真的很感激你的想法创建一个视图或一个计算列,从文本列中只提取日期部分;然后可以在其上创建索引,并改为用于筛选行。当您在一起创建ID和时间索引时,是否需要定期更新索引?数据库是否自行处理此更新?