找出哪个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
问题
- 如果第一次检查本身失败,我将无法继续调查其他组合。
- 这似乎也不是很有效,因为这个存储过程被调用了数百次。
其他 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
问题背景
我试图确定什么情况导致没有记录/行最多,以便让我找到数据库中哪些数据可能需要清理的根本原因。
例如,从下面的查询中,我想知道是第一个条件大部分时间都失败了,还是第二个条件最令人反感,依此类推。
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
问题
- 如果第一次检查本身失败,我将无法继续调查其他组合。
- 这似乎也不是很有效,因为这个存储过程被调用了数百次。
其他 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