找出哪个where子句最麻烦

Find which where clause is the most troublesome

问题背景

我试图确定什么情况导致没有记录/行最多,以便让我找到数据库中哪些数据可能需要清理的根本原因。

例如,从下面的查询中,我想知道是第一个条件大部分时间都失败了,还是第二个条件最令人反感,依此类推。

SELECT TOP 1
FROM table 
WHERE column1 = @param1  -- (cndtn 1)This condition works without anding with other conditions
  AND column2 = @param2
  AND column3 = @param3  -- (cndtn 3) This with 1 works 10% of the time
  AND column4 = @param4

我想到的一个想法是打破一次使用一个条件的过程。

DECLARE @retVal int

SELECT @retVal = COUNT(*) 
FROM table
WHERE column1 = @param1

IF (@retVal > 0)
   --Do Something like above but by using @param2, @param3 and so on

问题

  1. 如果第一次检查本身失败,我将无法继续调查其他组合。
  2. 这似乎也不是很有效,因为这个存储过程被调用了数百次。

其他 SO Post 我也觉得这个很棒 post (Find which one of the WHERE clauses succeeded) 但是当没有记录时这不是很有帮助返回。

如果这只是为了调试,检测何时 @@ROWCOUNT = 0 并将这些参数存储在单独的调试 table 中怎么样?

SELECT  TOP 1 *
FROM    SomeTable
WHERE   column1 = @param1 
AND     column2 = @param2
AND     column3 = @param3 
AND     column4 = @param4
-- order by ....
;    

-- one or more parameters "failed"
IF @@ROWCOUNT = 0
BEGIN
     INSERT INTO SomeTable_Debug( createdDate, column1, column2, column3, column4, column5)
     VALUES (getDate(), @param1, @param2, @param3, @param4, @param5)
END

稍后您可以在单独的查询脚本中使用调试 table,而不必担心它对频繁调用的过程的影响。例如,当条件“失败”时,此查询 returns 1,否则它 returns null。它没有针对效率进行优化,但偶尔调试使用应该没问题:

SELECT *
       , (SELECT 1 WHERE NOT EXISTS (SELECT NULL FROM SomeTable st WHERE st.column1 = d.column1)) AS Matches_Column1
       , (SELECT 1 WHERE NOT EXISTS (SELECT NULL FROM SomeTable st WHERE st.column2 = d.column2)) AS Matches_Column2
       , (SELECT 1 WHERE NOT EXISTS (SELECT NULL FROM SomeTable st WHERE st.column3 = d.column3)) AS Matches_Column3
       , (SELECT 1 WHERE NOT EXISTS (SELECT NULL FROM SomeTable st WHERE st.column4 = d.column4)) AS Matches_Column4
       , (SELECT 1 WHERE NOT EXISTS (SELECT NULL FROM SomeTable st WHERE st.column5 = d.column5)) AS Matches_Column5
FROM   SomeTable_Debug d

示例结果:

id createdDate column1 column2 column3 column4 column5 Matches_Column1 Matches_Column2 Matches_Column3 Matches_Column4 Matches_Column5
1 2022-04-18 16:51:11.487 1 22 3 4 5 null 1 null null null
2 2022-04-18 16:51:11.500 1 22 3 4 56 null 1 null null 1

db<>fiddle here