[SQL] 모든 (또는 대부분의) 데이터베이스에서 작동 효율적인 SQL 테스트 쿼리 또는 유효성 검사 쿼리
SQL모든 (또는 대부분의) 데이터베이스에서 작동 효율적인 SQL 테스트 쿼리 또는 유효성 검사 쿼리
대부분의 데이터베이스 연결 풀링 라이브러리는 게으름에 대한 자신의 SQL 연결을 테스트 할 수있는 기능을 제공합니다. 예를 들어, 라이브러리 C3P0를 풀링 JDBC 구성 간격으로 연결에서 실행됩니다 preferredTestQuery라는 속성이 있습니다. 마찬가지로, 아파치 코 몬즈 DBCP는 validationQuery가 있습니다.
내가 본 대부분의 예제 쿼리는 MySQL을위한 선택 (1) 사용하는 것이 좋습니다; 테스트 쿼리에 대한 값으로. 그러나,이 쿼리는 일부 데이터베이스 (FROM 절 1 개 예상하는을 선택하는 예를 들어, HSQLDB,)에서 작동하지 않습니다.
동등하게 효율적이지만 모든 SQL 데이터베이스에 대한 작동 데이터베이스에 얽매이지 쿼리가 있습니까?
편집하다:
이 아니라면, 캔 누군가는 다양한 데이터베이스 공급자에 대한 작동합니다 SQL 쿼리의 집합을 제안한다 (이 사건 것 같다)? 내 의도는 프로그램 내 데이터베이스 공급자 구성에 따라 사용할 수있는 문을 결정하는 것입니다.
해결법
-
==============================
1.여기에 몇 가지 답변의 도움과 함께 연구의 조금 후 :
여기에 몇 가지 답변의 도움과 함께 연구의 조금 후 :
SELECT 1
DUAL에서 1을 SELECT
any_existing_table 1 = 0 ~ 1 [
또는
INFORMATION_SCHEMA.SYSTEM_USERS로부터 1 SELECT
VALUES 1 SYSIBM.SYSDUMMY1 FROM SELECT 1
SYSIBM.SYSDUMMY1에서 1을 SELECT
SYSTABLES에서 수 (*)를 선택
-
==============================
2.드라이버는 JDBC 4 준수하는 경우, 테스트 연결에 전용 쿼리에 대한 필요가 없습니다. 대신, 연결을 테스트 할 수있다 Connection.isValid된다.
드라이버는 JDBC 4 준수하는 경우, 테스트 연결에 전용 쿼리에 대한 필요가 없습니다. 대신, 연결을 테스트 할 수있다 Connection.isValid된다.
JDBC 4는 2006 년 자바 (6)의 일부이며, 당신은 드라이버 지금이 기능을 지원한다!
유명한 연결 풀은 HikariCP처럼, 여전히 테스트 쿼리를 지정하는 설정 매개 변수가 있지만, 강하게 그것을 사용하는 낙담 :
-
==============================
3.불행하게도 항상 데이터베이스에 관계없이 작동에는 SELECT 문이 없습니다.
불행하게도 항상 데이터베이스에 관계없이 작동에는 SELECT 문이 없습니다.
대부분의 데이터베이스는 지원합니다
SELECT 1
일부 데이터베이스 테이블을 필요로하지 않을 때 당신이 사용할 수있는 DUAL라는 테이블이이 기능을 지원하지만이 없습니다 :
SELECT 1 FROM DUAL
MySQL은 또한 호환성을 위해이 작업을 지원하지만 모든 데이터베이스는 않습니다. 중 위의 지원하지 않는 데이터베이스에 대한 해결 방법은 단일 행, 다음 위의 의지 작업을 포함 DUAL라는 테이블을 만드는 것입니다.
HSQLDB 지원도 위의, 당신이 중 하나 DUAL 테이블이나 다른 사용을 만들 수 있도록의 :
SELECT 1 FROM any_table_that_you_know_exists_in_your_database
-
==============================
4.나는이 하나를 사용합니다 :
나는이 하나를 사용합니다 :
select max(table_catalog) as x from information_schema.tables
PostgreSQL을, MySQL과 MSSQL에 대한 (결과 1 개 행이) 실행 쿼리 체크 연결 및 능력.
-
==============================
5.나는 사용한다
나는 사용한다
Select COUNT(*) As X From INFORMATION_SCHEMA.SYSTEM_USERS Where 1=0
HSQLDB 1.8.0에 대한
-
==============================
6.선택 수 (*)를 사용하여 시험을 위해, * 모든 열 데이터를 판독 할 수 있기 때문에 발생할 수 선택 (1)를 사용하는 것이 더 효율적이어야한다.
선택 수 (*)를 사용하여 시험을 위해, * 모든 열 데이터를 판독 할 수 있기 때문에 발생할 수 선택 (1)를 사용하는 것이 더 효율적이어야한다.
-
==============================
7.확실하지 다른 사람에 대해, SQL 서버에서 작업 할 일을 선택합니다.
확실하지 다른 사람에 대해, SQL 서버에서 작업 할 일을 선택합니다.
그 테이블에서 테이블 다음 쿼리를 작성하는 표준은 ANSI SQL을 사용합니다.
-
==============================
8.영업을 가정하면 자바 대답을 원한다 :
영업을 가정하면 자바 대답을 원한다 :
JDBC3 / 자바 6으로 자신의 방법을 발명보다는 사용되어야 isValid () 메소드가있다.
드라이버의 구현은이 방법의 ID가 전화했을 때 데이터베이스에 대해 쿼리의 일종을 실행하는 데 필요합니다. 당신은 - 단순한 JDBC 사용자로 - 알거나이 쿼리가 무엇인지 이해 할 필요가 없습니다. 당신이해야 할 모든 JDBC 드라이버의 창조자가 제대로 그 / 그녀의 작업을 수행 할 것을 신뢰하는 것입니다.
-
==============================
9.방법에 대한
방법에 대한
SELECT user()
내가 좋아, 내가 다른 사람을 모르는되는이 before.MySQL, H2를 사용합니다.
-
==============================
10.바로 그것이라는 어려운 방법을 발견
바로 그것이라는 어려운 방법을 발견
SELECT 1 FROM DUAL
맥스 DB에 대한뿐만 아니라.
-
==============================
11.Oracle의 높은 수행하는 쿼리가 될 것입니다
Oracle의 높은 수행하는 쿼리가 될 것입니다
select 'X' from <your_small_table> where <primay_key_coulmn> = <some_value>
이것은 성능 측면에서입니다.
-
==============================
12.나는 파이어 버드를 위해 이것을 사용
나는 파이어 버드를 위해 이것을 사용
select 1 from RDB$RELATION_FIELDS rows 1
-
==============================
13.MSSQL하십시오.
MSSQL하십시오.
이 연결된 서버가 살아 있다면 내가 결정 도왔다. 오픈 쿼리 연결과 TRY의 CATCH를 사용하면 유용 뭔가 오류의 결과를 넣어.
IF OBJECT_ID('TEMPDB..#TEST_CONNECTION') IS NOT NULL DROP TABLE #TEST_CONNECTION IF OBJECT_ID('TEMPDB..#RESULTSERROR') IS NOT NULL DROP TABLE #RESULTSERROR IF OBJECT_ID('TEMPDB..#RESULTSGOOD') IS NOT NULL DROP TABLE #RESULTSGOOD DECLARE @LINKEDSERVER AS VARCHAR(25) SET @LINKEDSERVER = 'SERVER NAME GOES HERE' DECLARE @SQL AS VARCHAR(MAX) DECLARE @OPENQUERY AS VARCHAR(MAX) --IF OBJECT_ID ('dbo.usp_GetErrorInfo', 'P' ) IS NOT NULL DROP PROCEDURE usp_GetErrorInfo; --GO ---- Create procedure to retrieve error information. --CREATE PROCEDURE dbo.usp_GetErrorInfo --AS --SELECT -- ERROR_NUMBER() AS ErrorNumber -- ,ERROR_SEVERITY() AS ErrorSeverity -- ,ERROR_STATE() AS ErrorState -- ,ERROR_PROCEDURE() AS ErrorProcedure -- ,ERROR_LINE() AS ErrorLine -- ,ERROR_MESSAGE() AS Message; --GO BEGIN TRY SET @SQL=' SELECT 1 ''' --SELECT @SQL SET @OPENQUERY = 'SELECT * INTO ##TEST_CONNECTION FROM OPENQUERY(['+ @LINKEDSERVER +'],''' + @SQL + ')' --SELECT @OPENQUERY EXEC(@OPENQUERY) SELECT * INTO #TEST_CONNECTION FROM ##TEST_CONNECTION DROP TABLE ##TEST_CONNECTION --SELECT * FROM #TEST_CONNECTION END TRY BEGIN CATCH -- Execute error retrieval routine. IF OBJECT_ID('dbo.usp_GetErrorInfo') IS NOT NULL -- IT WILL ALWAYS HAVE SOMTHING... BEGIN CREATE TABLE #RESULTSERROR ( [ErrorNumber] INT ,[ErrorSeverity] INT ,[ErrorState] INT ,[ErrorProcedure] INT ,[ErrorLine] INT ,[Message] NVARCHAR(MAX) ) INSERT INTO #RESULTSERROR EXECUTE dbo.usp_GetErrorInfo END END CATCH BEGIN IF (Select ERRORNUMBER FROM #RESULTSERROR WHERE ERRORNUMBER = '1038') IS NOT NULL --'1038' FOR ME SHOWED A CONNECTION ATLEAST. SELECT '0' AS [ErrorNumber] ,'0'AS [ErrorSeverity] ,'0'AS [ErrorState] ,'0'AS [ErrorProcedure] ,'0'AS [ErrorLine] , CONCAT('CONNECTION IS UP ON ', @LINKEDSERVER) AS [Message] ELSE SELECT * FROM #RESULTSERROR END
docs.microsoft.com
from https://stackoverflow.com/questions/3668506/efficient-sql-test-query-or-validation-query-that-will-work-across-all-or-most by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] CTE, 하위 쿼리, 임시 테이블 또는 테이블 변수 사이의 성능 차이가 있나요? (0) | 2020.04.13 |
---|---|
[SQL] 어떻게 MySQL을 텍스트로 BLOB에서 변환합니까? (0) | 2020.04.12 |
[SQL] 현대 RDBMS의에 인라인 진술보다 일반적으로 더 효율적인 저장 프로 시저 있습니까? [복제] (0) | 2020.04.12 |
[SQL] 어떻게 데이터를 복사하지 않고 Oracle 테이블의 복사본을 만들 수 있습니까? (0) | 2020.04.12 |
[SQL] 페이스 북 데이터베이스 설계? (0) | 2020.04.12 |