복붙노트

[SQL] SQL 서버 : 나는 SYS 테이블을 통해 INFORMATION_SCHEMA 테이블을 사용해야합니까?

SQL

SQL 서버 : 나는 SYS 테이블을 통해 INFORMATION_SCHEMA 테이블을 사용해야합니까?

SQL 서버에서 메타 데이터에 대한 두 가지 스키마가있다 :

나는 INFORMATION_SCHEMA 테이블이 ANSI 표준을 기반으로하는 것을 들었습니다. 예를 들어, 개발하는 경우 저장 프로 시저, 그것은 SYS 테이블을 통해 INFORMATION_SCHEMA 테이블을 사용하는 것이 현명해야 하는가?

해결법

  1. ==============================

    1.나는 항상 직접 SYS 스키마를 쿼리를 통해 INFORMATION_SCHEMA 뷰를 사용하려고합니다.

    나는 항상 직접 SYS 스키마를 쿼리를 통해 INFORMATION_SCHEMA 뷰를 사용하려고합니다.

    보기는 쉽게 다른 RDBMS를 통해 어떤 쿼리를 마이그레이션 할 수 있어야한다 이론 때문에 ISO를 준수합니다.

    그러나, 나는 필요한 정보가 뷰에서 사용할 수 단지없는 경우가 있었다.

    나는 더 뷰에 대한 정보와 SQL Server 카탈로그를 쿼리 일부 링크를 제공했습니다.

    http://msdn.microsoft.com/en-us/library/ms186778.aspx

    http://msdn.microsoft.com/en-us/library/ms189082.aspx

  2. ==============================

    2.당신이 사실을 알고 응용 프로그램을 작성하지 않는 이식을 필요로하거나 당신은 단지 그냥 시작하는 독점 SQL Server 시스템 뷰를 사용하여 기본 것이 매우 기본적인 정보를 원할 것입니다.

    당신이 사실을 알고 응용 프로그램을 작성하지 않는 이식을 필요로하거나 당신은 단지 그냥 시작하는 독점 SQL Server 시스템 뷰를 사용하여 기본 것이 매우 기본적인 정보를 원할 것입니다.

    INFORMATION_SCHEMA 뷰는 단지 SQL-92 표준과 호환되는 객체를 보여줍니다. 이 수단과 같은 인덱스 심지어 아주 기본 구조에 대한 정보 스키마 뷰 (이 표준에서 정의되지 않은 및 구현 세부 사항으로 남아 있습니다.) 커녕 어떤 SQL 서버 고유의 기능은 없습니다.

    또한 하나는 가정 할 수 있음을 휴대 꽤 만병 통치약이 아니다. 구현은 여전히 ​​시스템간에 차이가 없습니다. 오라클은 전혀 "상자 아웃"을 구현하지 않고 MySQL의 워드 프로세서 말 :

    심지어 같은 외래 키 제약 조건으로 빵과 버터 SQL 구문에 대한 INFORMATION_SCHEMA 뷰는 SYS 이상으로 일을 크게 덜 효율적이 될 수 있습니다. 그들은 효율적인 쿼리를 허용하는 것이다 오브젝트 ID를 노출하지 않는 본다.

    예를 들면 왜 - 질문 SQL 쿼리 11분 1 초에서 속도 저하가 보이십니까? 및 실행 계획.

  3. ==============================

    3.INFORMATION_SCHEMA는 다양한 데이터베이스와 인터페이스해야 할 수도 있습니다 외부 코드에 더 적합합니다. 데이터베이스, 이식성 종류의 프로그래밍을 시작하면의 창을 꺼집니다. 당신이 저장 프로 시저를 작성하는 경우, 그것은 당신이 (더 나은 또는 더 나쁜 경우) 특정 데이터베이스 플랫폼에 저지른 알려줍니다. 당신은 SQL Server에 저지른 경우 모든 수단으로, 체계적으로 줄여 나가게 뷰를 사용합니다.

    INFORMATION_SCHEMA는 다양한 데이터베이스와 인터페이스해야 할 수도 있습니다 외부 코드에 더 적합합니다. 데이터베이스, 이식성 종류의 프로그래밍을 시작하면의 창을 꺼집니다. 당신이 저장 프로 시저를 작성하는 경우, 그것은 당신이 (더 나은 또는 더 나쁜 경우) 특정 데이터베이스 플랫폼에 저지른 알려줍니다. 당신은 SQL Server에 저지른 경우 모든 수단으로, 체계적으로 줄여 나가게 뷰를 사용합니다.

  4. ==============================

    4.나는 다른 몇 가지 답변을 반복하지만 성능 측면을 추가하지 않습니다. 마틴 스미스는 그의 대답에 언급대로 여러 기본 소스에서 수집해야하는 표준 열을 노출해야하기 때문에 INFORMATION_SCHEMA 뷰는,이 정보를 가장 효율적으로 소스 아니다. SYS 뷰는 높은 성능 요구 사항을 가지고 있고, 당신은 아마 SYS의 전망 가야 이동성에 대해 걱정할 필요가 없습니다 그렇다면, 그 관점에서보다 효율적으로 할 수있다.

    나는 다른 몇 가지 답변을 반복하지만 성능 측면을 추가하지 않습니다. 마틴 스미스는 그의 대답에 언급대로 여러 기본 소스에서 수집해야하는 표준 열을 노출해야하기 때문에 INFORMATION_SCHEMA 뷰는,이 정보를 가장 효율적으로 소스 아니다. SYS 뷰는 높은 성능 요구 사항을 가지고 있고, 당신은 아마 SYS의 전망 가야 이동성에 대해 걱정할 필요가 없습니다 그렇다면, 그 관점에서보다 효율적으로 할 수있다.

    예를 들어, 사용 아래의 첫 번째 쿼리는 테이블이 존재하는지 확인하는 INFORMATION_SCHEMA.TABLES. 두 번째는 같은 일을 sys.tables를 사용합니다.

    if exists (select * from information_schema.tables where table_schema = 'dbo' and table_name = 'MyTable')
        print '75% cost';
    
    if exists (select * from sys.tables where object_id = object_id('dbo.MyTable'))
        print '25% cost';
    

    당신이 이들의 IO를 볼 때 첫 번째 쿼리는 두 번째가 전혀없는 동안 논리적 4, sysschobjs 및 sysclsobjs을 읽고있다. 또한 첫 번째 두 번째는 하나의 클러스터 된 인덱스가 추구 않지만 두 개의 클러스터되지 않은 추구 인덱스 및 키 조회를 수행합니다. 먼저 한 비용 ~ 3 배 더 두 번째보다 쿼리 계획에 따라. 당신은 큰 시스템에서 시간이 많이해야 할 경우, 배치 시간이 최대 추가 및 원인 성능에 문제가 있다고 말한다. 그러나 이것은 정말에만 과도하게로드 시스템에 적용됩니다. IT는 비즈니스 시스템의 라인 대부분의 성능 문제의이 수준이 없습니다.

    또 대부분의 시스템에서 다른 쿼리에 비해, 이들의 전체 비용은 개별적으로 아주 작은하지만 시스템이 이런 활동을 많이 가지고 있다면, 그것은 추가 할 수 있습니다.

  5. from https://stackoverflow.com/questions/3653637/sql-server-should-i-use-information-schema-tables-over-sys-tables by cc-by-sa and MIT license